【问题标题】:laravel 5 query multiple constraint on eager loadlaravel 5查询急切负载的多个约束
【发布时间】:2017-04-13 00:42:00
【问题描述】:

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

//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 在急切加载的数据中被过滤。

有什么我错过的事情吗?是不是我写错了?

【问题讨论】:

  • @Veerendra nope,请仔细阅读标题。
  • 首先,您的第一种和第二种方法具有相同的意义,只是编写的模式不同。其次,您甚至没有尝试过两种方法中的第二个 where 子句。请使用您为第二个 where 子句尝试过的代码发布代码。请参考示例 $users = User::with(array( 'posts' => function($query, $title) { $query->where('title', '=', $title); }, 'posts .tags' => function($query) { $query->where('tag_type', '=', 'admin') } ))->get();
  • 拼写错误,已完成更新。此外,您的示例代码看起来与我想要实现的不同。
  • 这应该 100% 工作。您能否检查您的 MySQL 日志或原始 SQL 以确认正在构建什么查询?

标签: php laravel laravel-5 laravel-5.2


【解决方案1】:

尝试使用嵌套预加载。比如:

$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 来检查这个字符串是如何工作的。

    【讨论】:

      【解决方案3】:

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

      在你的User 模型中是否有一些使用->orderBy() 的作用域,所以 orderBy() 中的闭包会混淆。

      dd($query->toSql()) 关闭可能对你有帮助。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2020-02-26
          • 1970-01-01
          • 2013-05-29
          • 1970-01-01
          • 1970-01-01
          • 2019-12-24
          • 2015-03-19
          • 2015-01-31
          • 1970-01-01
          相关资源
          最近更新 更多