【问题标题】:Laravel with subquery ignores where带有子查询的 Laravel 忽略 where
【发布时间】:2019-08-14 14:49:50
【问题描述】:

我有一个应用程序,其中

一个EventDateItem属于一个Event,一个Event有Categories,一个Event有CollectionItems

我有以下问题

$eventsQuery = EventDateItem::with([
    'event.categories',
    'event.collectionItems' => function ($q) use ($collectionItem) {
        $q->select('thisdoesntexist');
    }
])->whereDate('date', '>', Carbon::now());

当我使用toSql() 返回 sql 时会发生什么,如下

select * from `event_date_items` where date(`date`) > ?

所以它忽略了我的 with() 子句和其中的 where 子句。 我错过了什么吗?

【问题讨论】:

  • Laravel 执行一个额外的查询来加载关系,因此它们不会显示为 toSql,您必须使用 DB::getQueryLog() 来获取所有执行的查询。检查this
  • 您得到想要的答案了吗?或者您需要更多信息?
  • 嗯,我明白他们在说什么,但这并不能真正解决这里的问题。一定有办法从您包含的关系中选择列?

标签: laravel eloquent query-builder


【解决方案1】:

With 子句用于第二个查询,更多信息Here

在实践中,它对主要的Model(在您的示例中为EventDateItem)执行first Query

然后另一个查询每个关系看起来像这样SELECT thisdoesntexist FROM collection_items where event_date_item_id in (?, ?, ?, ?, ?)

第二个查询中的占位符是第一个查询返回的id。

【讨论】:

    【解决方案2】:

    with() 语句不会在同一个 sql 查询中执行,这些语句是在主查询解析后执行,然后映射到正确的模型上。

    如果您希望能够查看所有查询,可以使用laravel-debugbar 之类的工具。

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 2012-12-29
      • 2013-09-04
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多