【问题标题】:Laravel - Filter collection by checking if value exists in array in databaseLaravel - 通过检查数据库中的数组中是否存在值来过滤集合
【发布时间】:2018-09-26 03:51:18
【问题描述】:

我想根据存储在表中的数组中是否存在单个值来返回帖子集合。

在我的帖子表中,我有常规的列名,例如“title”、“body”和“slug”。我正在使用同一个表管理多个站点,因此我有一个额外的列名“site_ids”。当用户创建帖子时,他们会选择他们希望发布的站点并将站点 ID 存储为数组(例如 [1,2])

-----------------------------------------------
| Title         | Site_ids     | Slug         |
-----------------------------------------------
| Test Title    |[1,2,3]       |test-title    |
-----------------------------------------------
| Another Title |[1,6]         |another-title |
-----------------------------------------------

现在我正在创建一个 API 来返回所有 site_id 为 1 的帖子。如何实现?这是我在 PostController 中的当前代码

API 路由

Route::get('/{site_id}/posts','PostController@index')->name('Show Posts');

代码:

  public function index($site_id)
    {
        // Return all posts by id
        $posts = Post::whereIn('sites', $site_id)->get();
        return new PostCollection($posts);
    }

我收到此错误消息

为 foreach() 提供的参数无效

我在这里做错了什么?

【问题讨论】:

  • 在这种情况下,foreach() 是什么? PostCollectionview() 的包装器吗?
  • @TimLewis 这是一个 Laravel 帖子收集资源laravel.com/docs/5.6/eloquent-resources
  • 啊,是的,那是我的错;没有看到 API(粗体和所有内容);必须是星期一。除此之外,我认为whereIn() 将第二个参数转换为一个数组,如果它不是一个,但下面的答案似乎是正确的。该查询是否有效?我不认为存储文字 [1, 2] 可以与 whereIn()...
  • 哈哈,今天是星期一!在我将其包裹在括号中之后,该查询现在正在工作。但是它返回 0 个项目。好像它没有通过我表中的数组?
  • 或者,目前要处理这个问题,您可以使用->where("sites", "LIKE", "%".$site_id."%"); 来处理通配符文本搜索(松散匹配[1, 2]1 等),但这是低效的,不是最好的方法.

标签: php mysql laravel eloquent


【解决方案1】:

你可以试试 whereRaw('JSON_CONTAINS(meta, "1")') 类似的东西。检查 mysql 中的command。如果您在 5.7 的 laravel 中运行,您可能需要查看 this

【讨论】:

    【解决方案2】:

    我知道这可能会被否决,但老实说,这是你做错的:

    “我想返回一个帖子集合,基于如果单个 值存在于存储在表中的数组中。”

    您应该使用数据透视表在帖子和站点之间建立多对多关系,然后您可以执行以下操作:

    Site::find($id)->Posts;
    

    https://laravel.com/docs/5.6/eloquent-relationships#many-to-many

    【讨论】:

      【解决方案3】:

      whereIn 的第二个参数必须是一个数组。你应该这样做:

      public function index($site_id)
      {
          // Return all posts by id
          $posts = Post::whereRaw('JSON_CONTAINS(sites, \'{$site_id}\')')->get();
          return new PostCollection($posts);
      }
      

      【讨论】:

      • 所以我用括号包裹了值,现在我没有收到错误消息。但是它返回 0 个项目。有什么想法吗?
      • 我已经更新了,应该可以了。我还没有测试过。但你会明白的。
      猜你喜欢
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      相关资源
      最近更新 更多