Laravel - Фильтр коллекции, проверяя, существует ли значение в массиве в базе данных - PullRequest
0 голосов
/ 24 сентября 2018

Я хочу вернуть коллекцию сообщений, основываясь на том, существует ли единственное значение в массиве, хранящемся в таблице.

В моей таблице сообщений есть обычные имена столбцов, такие как 'title', 'body' и 'slug'.Я управляю несколькими сайтами, используя одну и ту же таблицу, поэтому у меня есть дополнительное имя столбца 'site_ids'.Когда пользователь создает сообщение, он выбирает, на каких сайтах он хочет опубликовать, и он сохраняет идентификаторы сайта в виде массива (например, [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 голосов
/ 24 сентября 2018

Я знаю, что это может привести к понижению, но, честно говоря, это то, что вы делаете неправильно:

"Я хочу вернуть коллекцию сообщений, основываясь на том, существует ли одно значениев массиве, хранящемся в таблице. "

Вы должны установить отношение" многие ко многим "между сообщениями и сайтами с помощью сводной таблицы, и тогда вы можете просто сделать что-то вроде этого:

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

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

0 голосов
/ 25 сентября 2018

вы можете попробовать гдеRaw ('JSON_CONTAINS (meta, "1") ") что-то в этом роде.проверьте команду в mysql.а также, если вы бежите в 5.7 laravel, вы можете проверить это

0 голосов
/ 24 сентября 2018

Второй параметр для whereIn должен быть массивом.Вы должны сделать это:

public function index($site_id)
{
    // Return all posts by id
    $posts = Post::whereRaw('JSON_CONTAINS(sites, \'{$site_id}\')')->get();
    return new PostCollection($posts);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...