【问题标题】:Get each item in a collection with one query使用一个查询获取集合中的每个项目
【发布时间】:2021-07-28 23:16:41
【问题描述】:

我有一组 slug,想通过一个查询获取每个对应的页面。

类似...

Page::whereIn('slug', $slugs)->get();

... 只返回与集合中任何 slug 匹配的第一页。

目前有一个循环,但这是我想避免的几十个查询。

【问题讨论】:

    标签: database laravel eloquent model mariadb


    【解决方案1】:

    尝试使用whereRaw 方法并将您的数组内爆成一个字符串:

    Page::whereRaw('slug IN ("' . $slugs->implode('","') . ')')->get();
    

    【讨论】:

    • 感谢whereRawIN 的提示!我不得不编辑您的解决方案,现在它可以工作了。
    【解决方案2】:

    事实证明,whereIn 是正确的方法。我的逻辑有一个小错误,同时播种数据不足,导致一切崩溃。

    如果有人不知道:whereRaw 应谨慎使用。为避免 SQL 注入漏洞,所有用户提交的条目都必须作为参数传递。

    Page::whereRaw('slug IN (?)', [$slug]);
    

    注意:用引号包裹? 是语法错误。默认情况下,传递的数据将被单引号引用,至少在我的机器上是这样的。

    select * from `pages` where `slug` in ('page');
    

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      相关资源
      最近更新 更多