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

gjmwrych  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(355)

我想返回一个post集合,基于表中存储的数组中是否存在单个值。
在我的posts表中,我有常规的列名,比如“title”、“body”和“slug”。我使用同一个表管理多个站点,因此我有一个额外的列名'site\u ids'。当用户创建一篇文章时,他们会选择要发布的站点,并将站点id存储为一个数组(例如[1,2])

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

现在我正在创建一个api来返回站点id为1的所有帖子。如何做到这一点?这是我的后控制器中的当前代码
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()提供的参数无效
我做错什么了?

hc8w905p

hc8w905p1#

您可以尝试whereraw('json_contains(meta,“1”)')之类的东西。检查mysql中的命令。另外,如果你在5.7的拉威尔你可能要检查这个

ee7vknir

ee7vknir2#

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

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

6yoyoihd3#

我知道这很可能会被否决,但老实说,这就是你做错的地方:
我想返回一个post集合,基于表中存储的数组中是否存在单个值
您应该使用透视表在帖子和站点之间建立多对多关系,然后您可以执行以下操作:

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

https://laravel.com/docs/5.6/eloquent-relationships#many-对很多人来说

相关问题