如何从相关表中获取属性作为Laravel 5中自己的表的属性?

时间:2016-05-27 14:42:19

标签: database laravel laravel-5 relational-database laravel-5.2

这个问题可能听起来有些混乱,但我不知道如何用一句话更好地解释它。

这基本上描述了问题所在:

我有一个Users表,可以包含两种类型的用户。我知道如何按角色分开。但事实上,角色1的用户(editor_in_chief)与角色2(审阅者)的用户具有不同的属性。

我的想法是创建一个名为“reviewer_attributes”和“editor_in_chief_attributes”的表,并与此表创建一对一的关系,以保存users表的属性。

也许你有一个更好的主意,那也很棒。但是对于这种情况,我想知道是否可以调用数据库并从另一个表中获取这些用户的属性作为User对象的属性。

使用关系时使用数据库调用laravel会给我这样的东西:

user {
   id: 1,
   name: "Name",
   reviewer_attributes: {
      attribute_1: 'attribute_1',
      attribute_2: 'attribute_2',
      attribute_3: 'attribute_3',
   }
}

但这是我想反对获得的内容:

user {
   id: 1,
   name: "Name",
   attribute_1: 'attribute_1',
   attribute_2: 'attribute_2',
   attribute_3: 'attribute_3',
}

我希望通过单个数据库调用来实现此目的,而不是在调用后设置属性。

我发现这是一个非常有趣的话题,我希望你能提供帮助!

2 个答案:

答案 0 :(得分:1)

如果我的问题正确,你可以这样称呼:

DB::table('users')
    ->join('reviewer_attributes', 'users.id', '=', 'reviewer_attributes.user_id')
    ->find($id);

您可以添加select以获取每个表的特定属性:

DB::table('users')
    ->join('reviewer_attributes', 'users.id', '=', 'reviewer_attributes.user_id')
    ->select('users.id', 'users.name', 'reviewer_attributes.*')
    ->find($id);

更新:您还可以使用collections重新构建Eloquent返回的结果:

$result = User::with('reviewerAttributes')->find($id);

$result = $result->get('reviewer_attributes')
                 ->merge($result->forget('reviewer_attributes')->all())
                 ->all();

答案 1 :(得分:0)

你需要出口模型给Json吗? 如果是,请覆盖toArray方法

public function toArray()
{
    $arr = parent::toArray();
    $reviewer_attributes = $this->getReviewerAttributesSomeHow();
    return array_merge($arr, $reviewer_attributes);
}