这个问题可能听起来有点令人困惑,但我不知道如何用一句话更好地解释它。
这基本上描述了问题所在:
我有一个用户表,其中可以包含两种类型的用户。我知道如何按角色进行区分。但事情是这样的,角色 1(主编)的用户与角色 2(审稿人)的用户具有不同的属性。
我的想法是创建一个名为“reviewer_attributes”和“editor_in_chief_attributes”的表,并与该表创建一对一关系以保存用户表的属性。
也许你有更好的主意,那就太好了。但对于这种情况,我想知道是否可以调用数据库并从另一个表中获取这些用户的属性作为 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',
}
我想通过单个数据库调用来实现此目的,而不是在调用后设置属性。
我觉得这是一个非常有趣的话题,希望你能帮忙!
如果我解决了你的问题,你可以这样称呼:
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();
您需要将模型导出为 Json 吗?
如果是这样,请重写
toArray
方法
public function toArray()
{
$arr = parent::toArray();
$reviewer_attributes = $this->getReviewerAttributesSomeHow();
return array_merge($arr, $reviewer_attributes);
}