【问题标题】:Laravel/Eloquent relationship issueLaravel/Eloquent 关系问题
【发布时间】:2013-02-10 20:52:08
【问题描述】:

我有一个名为“用户”的模型,包含以下信息:

id
name
status_id

我有一个名为“状态”的模型,包含以下信息:

id
description

在执行原始查询时,自然会加入 users.status_id = status.id 上的两个表,但我想使用 Laravel 的 Eloquent ORM 来获取用户的状态文本。

例如。 User::find(1)->status()->description

提供了许多不同的功能,例如has_onehas_manybelongs_to,但这些都不起作用。有人对我如何做这样的事情有任何想法吗?

【问题讨论】:

  • “这些都不起作用” 不是可接受的问题描述。

标签: laravel eloquent


【解决方案1】:

按照您设置数据库的方式,您可以向 Status 模型添加一个只有一个用户的方法。

在您的 STATUS 模型中:

public function user()
{
    return $this->has_one('User');
}

这将使您可以按状态而不是按用户进行查询。要实现您想要的功能,即User::find(1)->status()->description,您需要让您的数据库看起来像这样

Users

    id
    name

Status

    id
    description
    user_id

现在您将在您的用户模型中实现以下内容

public function status()
{
    return $this->has_one('Status');
}

允许您使用:

User::find(1)->status()->description;

这将允许您在用户和状态之间建立一对一的关系。要实现一对多关系,即一个用户有多个状态(可能不是最好的示例),您可以使用与上述相同的数据库设置,但在用户模型中,您将返回 user() 函数:

$this->has_many('Status');

【讨论】:

  • 谢谢 - 支持深入的回答。不幸的是,像你建议的那样改变数据库结构对我来说不是正常的形式。事实证明,我正在寻找的答案与我提出的问题并不完全一致,我找到了下面列出的答案。
  • Darren 不用担心,我刚刚写了 Laravel 希望您的数据库看起来像这样以使关系正常工作。 :)
【解决方案2】:

我找到了答案。我可以通过运行 Fluent 查询而不是使用原生关系来完成上述操作:

 public function status() {

    return Status::where('id', '=', $this->status_id)->first();
 }

【讨论】:

    猜你喜欢
    • 2015-06-27
    • 2017-04-28
    • 1970-01-01
    • 2015-07-05
    • 2016-09-20
    • 1970-01-01
    • 2021-06-19
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多