Laravel-通过检查数据库中数组中是否存在值来过滤集合

时间:2018-09-24 19:08:41

标签: php mysql laravel eloquent

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

在我的帖子表中,我有常规的列名,例如“ 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()提供的参数无效

我在这里做什么错了?

3 个答案:

答案 0 :(得分:1)

您可以尝试whereRaw('JSON_CONTAINS(meta,“ 1”)')类似的东西。检查mysql中的command。并且如果您在laravel 5.7中运行,则可能需要检查this

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我知道这很可能会被否决,但是老实说,这就是您做错的事情:

  

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

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

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

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