我目前正在优化我的应用程序,有一件事就是只从数据库中选择真正需要的东西。
例如,当我检索用户对象时,我通常会这样做:
$user = User::where($attribute, '=', $value)->first();
此代码将返回包含所有列的完整用户对象。我的用户表非常大,所以我认为只选择我需要的列是个好主意:
$user = User::where($attribute, '=', $value)->first($columns);
这也按预期工作。但我的问题是,只要我指定列,$ user变量的关系就不再起作用,因为它不再是一个对象。
我的问题:是否可以只选择几列,但仍然可以使用
之类的关系$user->parents
谢谢!
答案 0 :(得分:0)
试试这个
$user = User::where($attribute, '=', $value)->select($columns)->first();
答案 1 :(得分:0)
只需为要获得的关系添加所有外键。例如,如果您想使用parent()
关系,只需将密钥添加到$columns
:
array_push($columns, 'parent_id');
之后,您将能够使用parent()
关系。
答案 2 :(得分:0)
是的,可以加载与选定列的关系,但是为此必须选择该关系表的foreign keys
。
因此,在这里您还必须选择user
表中的列,该列是parents
表中的外键,并使用with()
来提及关系,
例如,如果您将user_id
表中的parents
列作为外键,那么在id
方法中提到columns数组时,必须选择用户的first()
列如下:
$user = User::with('parents')->where($attribute, $value)->first(['id','email','image']); // also select 'id' for foreign key to load relationship
使用上述代码后,您可以将父母的关系设为:$user->parents
,并且不要忘记在您的User
模型中放置关系。
如果用户表上的外键为parent_id
,属于parents
表,则必须选择parent_id
列,如下代码:
$user = User::with('parents')->where($attribute, $value)->first(['parent_id','email','image']);