繁体   English   中英

laravel 5在eager load上查询多个约束

[英]laravel 5 query multiple constraint on eager load

在我的控制器中,我有以下代码:

//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()子句和1个 orderBy在预先加载的数据中进行过滤。

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

尝试使用嵌套的预先加载。 就像是:

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

问题是你的orderBy是在“子查询”中制作的。 当laravel进行连接时 (这是一个急切的加载),order_by将与您无关。

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

$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你可以使用调试栏来检查这个字符串是如何工作的。

正如您的描述,两种方法都应该运作良好。

是否有一些范围在您的User模型中使用->orderBy() ,因此带有闭包的orderBy()会混淆。

带闭包的dd($query->toSql())对你有帮助。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM