【问题标题】:Laravel eager loading with value of current model?Laravel 急切加载当前模型的值?
【发布时间】:2020-09-08 04:28:33
【问题描述】:

大家好,是否可以在急切加载中执行此操作?

Client::with(['relationship' => function($query){ 
     $query->whereBetween('created_at', [$client->failed_date, Carbon::now()->endOfDay()])
}])->get();

基本上我想将我的 CLIENT 模型中的 failed_date 列放入预加载查询中。

【问题讨论】:

  • 你想和特定的客户一起做吗?
  • 基本上我想做这样的事情 foreach($clients as $client){ $clients->relationship = $clients->relationship->whereBetween('created_at', [$client->failed_date , $client->pass_date]); }
  • 你想在回调中做那个 foreach 吗?
  • 编辑了我的评论。
  • 不,基本上我想要一个类似 foreach 的方法,但在 eagerloading 中完成。我想将我当前的客户提供给 where 条件。

标签: laravel eloquent eager-loading


【解决方案1】:

由于所有类型的 Eloquent 关系都是通过方法定义的,因此您可以调用这些方法来获取关系的实例,而无需实际执行关系查询。此外,所有类型的 Eloquent 关系还充当查询构建器,允许您在最终对数据库执行 SQL 之前继续将约束链接到关系查询。

例如。

$clients = Client::where('status', 1)->get();

foreach($clients as $client) {
    $relationships = $client->relationship()
        ->whereBetween('created_at', [$client->failed_date, $client->pass_date]);
}

这样你就可以解决你的问题了。

如果您尝试预先加载您的关系,因为预先加载将执行一个单独的查询,您无法直接访问父表,因此您需要加入它。

public function relationship()
{
    return $this->belongsTo(Client::class)
        ->selectRaw('clients.*')
        ->join('relationships', 'clients.id', '=', 'relationships.client_id')
        ->whereRaw("....");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-10
    • 2013-05-16
    • 2013-03-27
    • 2021-11-29
    • 2019-05-19
    • 2015-06-19
    • 2018-12-11
    相关资源
    最近更新 更多