这个问题听起来可能有点混乱,但我不知道如何用一句话来更好地解释它。
这基本上描述了问题所在:
我有一个用户表,可以包含两种类型的用户。我知道怎样才能按角色区分。但问题是,角色1(主编)的用户与角色2(审阅者)的用户具有不同的属性。
我的想法是创建一个名为“reviewer_attributes”和“editor_in_chief_attributes”的表,并创建与此表的一对一关系来保存用户表的属性。
也许你有更好的主意,那也太好了。但是对于这个场景,我想知道是否可以调用数据库,并从另一个表中获取这些用户的属性作为用户对象的属性。
当使用关系数据库调用时,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重新构造由雄辩返回的结果:
$result = User::with('reviewerAttributes')->find($id);
$result = $result->get('reviewer_attributes')
->merge($result->forget('reviewer_attributes')->all())
->all();