在 Eloquent 急切加载中选择特定字段不起作用

Posted

技术标签:

【中文标题】在 Eloquent 急切加载中选择特定字段不起作用【英文标题】:Select specific fields in Eloquent eager loading not working 【发布时间】:2018-11-10 09:27:14 【问题描述】:

我有一个属于UserNotifications 模型。我想在选择通知集合时加载用户,并且只加载带有namesemails 的模型。但是,当使用 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 急切加载中选择特定字段不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 动态关系 - 在急切加载时访问模型属性

使用 laravel 急切加载选择特定列不起作用

Eloquent:急切加载选择约束?可能?

急切加载时为 Eloquent 关系别名

Laravel Eloquent 中的急切加载

急切加载 Laravel Eloquent 相关模型