在Laravel 5中,在急加载中查询多个限制条件。

21 浏览
0 Comments

在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();

在这两种方法中,只读取了查询的第一个条件

我想要在急切加载的数据中过滤1where()子句和1orderBy子句。

我有什么遗漏了吗?我写错了吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

问题在于你的orderBy是在“子查询”中进行的。当laravel进行连接(这就是贪婪加载),orderBy对你不是相关的。

我认为一个有用的解决方案是在查询之外使用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来检查此字符串将如何工作。

0
0 Comments

尝试使用嵌套式贪婪加载。类似如下方式: \n

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

0