在 Eloquent 急切加载中选择特定字段不起作用
Posted
技术标签:
【中文标题】在 Eloquent 急切加载中选择特定字段不起作用【英文标题】:Select specific fields in Eloquent eager loading not working 【发布时间】:2018-11-10 09:27:14 【问题描述】:我有一个属于User
的Notifications
模型。我想在选择通知集合时加载用户,并且只加载带有names
和emails
的模型。但是,当使用 select 方法时,查询返回 null。
$notifications->load(['user' => function($query)
$query->select(["name","email"]);
]);
如果select()
方法的参数如下所示,则给出所有字段:
$notifications->load(['user' => function($query)
$query->select(["*"]
]);
【问题讨论】:
只是一个问题:为什么要在急切加载时选择?如果要过滤响应的结果,可以将protected $hidden = []
添加到模型中。
您使用 $notifications 而不是 Notification 模型是否有特定原因?
如果你已经创建了一个集合,你不能强制转换->加载该集合,至少加载方法不会出现在 laravel 文档laravel.com/docs/5.6/eloquent-collections#available-methods的集合可用方法上
@GaimZz 这不是真的:laravel.com/docs/5.6/eloquent-relationships#lazy-eager-loading
只有在您选择外键列 (id
) 时才有效加载。
【参考方案1】:
也许选择这样的字段可以解决问题:
$notifications->load('user:id,name,email');
您正在尝试的是添加约束,而不是选择某些字段
【讨论】:
当您需要为查询添加一些约束时,它不适用于闭包。【参考方案2】:只需要添加主键列就可以了。
$notifications->load(['user' => function($query)
$query->select(["ID","name","email"]);
]);
这样任何约束都可以添加到查询中。
【讨论】:
如果反之,则需要包含外键:$user->load(['notifications' => function($q) $q->select(['user_id', 'message']); ]);
,因为 'id' 不起作用。【参考方案3】:
如果您使用 select 输入数据,则必须传递 foreign_key。 看看
public function index()
$employee = Employee::with(['pay_salary' => function($query)
$query->select(['employee_id','salary_amount'])
->whereMonth('paying_date',\Carbon\Carbon::now()->month);
,'getSalary:id,employeeID,salary'])->get();
return View::make('admin.salary.index',['data' => $employee]);
【讨论】:
以上是关于在 Eloquent 急切加载中选择特定字段不起作用的主要内容,如果未能解决你的问题,请参考以下文章