【问题标题】:Eloquent query not returning the expected result雄辩的查询没有返回预期的结果
【发布时间】:2021-01-12 13:33:18
【问题描述】:

我正在尝试使用这个雄辩的查询来查询我的数据库中的表,其中包含一组值,

FlightRequest::where('public', 1)
->where(function ($q) use ($query) {
    $q->whereIn('departure', $query);
    $q->orWhereIn('arrival', $query);
})
->whereNull('acceptee_id')
->orderBy('id', 'asc')
->get();

我的 query 变量是我的 FlightRequest 表中的 2 个值 ['EGLL', 'EGKK'] 的数组不会被退回。

我在查询中尝试了dd,它返回了这个 SQL 语句

select * from `flight_requests` where `public` = 1 and (`departure` in ('EGLL', 'EGKK') or `arrival` in ('EGLL', 'EGKK')) and `acceptee_id` is null order by `id` asc

这个语句应该有效,但我不知道如何更正它以返回我想要的。

更新

我认为问题现在归结为出发和到达列是转换为数组的 JSON 列。我需要使用出发和到达 JSON 数组中的每个元素查询我的 $query 数组中的每个元素。

我试过了

$q->orWhereJsonContains('departure', $query);
$q->orWhereJsonContains('arrival', $query);

但这仅返回到达列为['EGLL', 'EGKK'] 的行,即两个数组相同的行

【问题讨论】:

  • 你可以在最后使用dd 方法而不是get 来查看生成的SQL 然后你可以直接运行那个SQL 查询,这样你就可以看到哪里出了问题。并根据需要进行修改。
  • @CanVural 应该提到查询是作为 API 的一部分的请求的结果,因此 dd 方法不起作用
  • 没关系。 dd 不是我建议的解决方案。只是为了查看生成的 SQL 并尝试调试有什么问题。因为目前看起来生成的 SQL 类似于 "select * from "flight_requests" where "public" = 1 and ("departure" in ('EGLL', 'EGKK') or "arrival" in ('EGLL', 'EGKK')) and "acceptee_id" is null order by "id" asc" 并且看起来很好。模型上是否有任何本地或全局范围?
  • @CanVural,不,我在模型上没有任何作用域,我知道 dd 不是解决方案,但我的问题是我实际上无法使用 dd 看到生成的 SQL
  • @CanVural 我已经用生成的 SQL 语句更新了原始帖子,我无法弄清楚它有什么问题

标签: php laravel eloquent


【解决方案1】:

我想这就是你要找的东西:

FlightRequest::where('public', 1)
->where(function ($q) use ($query) {
    foreach ($query as $apt) {
        $q->whereJsonContains('departure', $apt);
        $q->orWhereJsonContains('arrival', $apt);
    }
})
->whereNull('acceptee_id')
->orderBy('id', 'asc')
->get();

【讨论】:

    【解决方案2】:

    试试这个

    FlightRequest::where('public', 1)
    ->where(function ($q) use ($query) {
        $q->orWhereIn('departure', $query)->orWhereIn('arrival', $query);
    })
    ->whereNull('acceptee_id')
    ->orderBy('id', 'asc')
    ->get();
    

    【讨论】:

    • 这个答案不走运
    • 我想不明白你的问题... $query 是一个数组?你想检查出发和到达栏吗?
    • 是的,没错。出发和到达列都是转换为模型中数组的 JSON 列会不会是一个问题
    • 如果你使用NoSql你可以使用JSON操作符,另外如果你使用MySql你可以使用LIKE而不是=
    • 我在使用 MySQL,如何将您刚才所说的内容整合到我的查询中
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2015-02-14
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2016-06-28
    相关资源
    最近更新 更多