2016-11-29 41 views
5

在我的控制器我有以下代码:laravel 5查询急于上加载多个约束

//Example Data; 
$date = Carbon::now(); 
$order = 'name'; // it can be by name, id or created_at; 

// Approach i try for getting data of user with eager loaded products 

//1st approach 
$user = User::with([ 
    'products' => function ($query) use ($date, $order) { 
     $query->where('created_at', $date)->orderBy($order, 'desc'); 
    }, 
])->get(); 

//2nd approach 
$user = User::with([ 
    'products' => function ($query) use ($date, $order) { 
     $query->where('created_at', $date); 
     $query->orderBy($order, 'desc'); 
    }, 
])->get(); 

在这两个办法,只有1号条件的查询被读取。

我要让 where()条款和 orderBy在渴望加载的数据进行过滤。

有什么我错过了吗?我的代码错了吗?

+0

的可能的复制[如何创建多个地方使用的子句查询Laravel雄辩?](http://stackoverflow.com/questions/19325312/how-to-create-multiple-where-clause-query-using -laravel-eloquent) – Veerendra

+0

@Veerendra nope,请仔细阅读标题。 – Jefsama

+0

第一件事你的第一和第二种方法使相同的意义只是写的模式是不同的。其次,你甚至没有尝试过这两种方法中的第二个where子句。请将代码与您为第二个where子句尝试的内容一起发布。请参阅示例$ users = User :: with(array( 'posts'=> function($ query,$ title){$ query-> where('title','=',$ title);}, 'posts.tags'=> function($ query){$ query-> where('tag_type','=','admin')} )) - > get(); – Veerendra

回答

1

我通过向where()条件添加闭包来解决该问题。

$user = User::with([ 
    'products' => function ($query) use ($date, $order) { 
     $query->where(function ($q) use ($date, $order) { 
      $q->where('created_at', $date); //This can accept more where() condition 
     })->orderBy($order,'DESC'); 
    }])->get(); 
4

尝试使用嵌套的热切加载。有些是这样的:

$user = User::with([ 
    'products' => function ($query) use ($date) { 
      $query->where('created_at', $date); 
     },'products.order' =>function ($query) use ($order) { 
      $query->orderBy($order, 'desc'); 
     } 
    ])->get(); 
2

事情是,你的orderBy是在“子查询”。当laravel执行join(这是一种热切的加载)时,order_by将与您无关。

我认为一个有用的解决方案是使用查询外部的orderby子句,使用laravel提供的别名。

$user = User::with([ 'products' => function ($query) use ($date, $order) { $query->where('created_at', $date)->orderBy($order, 'desc'); }, ])->orderBy("$laravel_join_generated_alias.$order", 'desc')->get(); 其中$laravel_join_generated_alias您可以使用debugbar来检查此字符串的工作方式。

2

作为您的描述,这两种方法应该工作良好。

在您的User型号中是否有一些示波器使用->orderBy(),因此带有闭合的orderBy()处于困惑状态。

dd($query->toSql()) in with closure可能对您有帮助。

相关问题