Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 09.02.2020 04:04:43

Как сделать выборку из таблиц многие ко многим?

Здравствуйте!
Задача такая. Есть три таблицы, post, category, category_post. Соответственно в category_post (id_category, id_post) записываются id постов и категорий к этим постам. Нужно вывести схожие по категориям посты, уникальные. То есть, заходя на сайте на страницу записи, я хочу видеть посты из тех же категорий что и сам пост на котором нахожусь, но чтоб они не повторялись. Какие есть решения?

Не в сети

#2 09.02.2020 04:41:14

Re: Как сделать выборку из таблиц многие ко многим?

Хотелось бы увидеть как это делается через eloquent. Я в этом новичок, буду благодарен за ответ.

Не в сети

#3 09.02.2020 21:21:44

Re: Как сделать выборку из таблиц многие ко многим?

У меня нет под рукой подходящей базы, поэтому пишу не попробовав вживую:

$thisPostTagIds = $thisPost->tags->pluck('id');
$posts = Post::whereHas('tags', function($q) use($thisPostTagIds) {
    $q->whereIn('id', $thisPostTagIds);
})->where('id', '<>', $thisPost->id)
->get();

There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#4 14.04.2020 20:44:08

Re: Как сделать выборку из таблиц многие ко многим?

Здравствуйте!

Подскажите почему не работает выборка данных для связи многие ко многим.
Есть турниры, модель Tournament, и игроки, модель User.
Модели друг с другом связаны.

public function users(){
    	return $this->belongsToMany('App\User')->withPivot('tournament_id', 'user_id')->withTimestamps();
    }
public function tournaments(){
        return $this->belongsToMany('App\Tournament')->withPivot('tournament_id', 'user_id')->withTimestamps();
    }

Я хочу получить только турниры, у которых статус = 1 и на которые записался  пользователь.

Для этого использую нетерпеливую загрузку и ограничения нетерпеливой загрузки, как описано здесь - Нетерпеливая загрузка

В контроллере указано.

$viewerId = Auth::id();

$tournamentsForShow = Tournament::whereStatus(1)->with(['users' => function ($query){
                               $query->where('user_id', '=', '$viewerId');
                               }])->get();
       
foreach ($tournamentsForShow as $tournament) {
                echo $tournament->pivot->user_id;
}

получаю ошибку - Trying to get property 'user_id' of non-object

Не в сети

#5 21.04.2020 18:59:21

Re: Как сделать выборку из таблиц многие ко многим?

Этот запрос выводит турниры со статусом 1, на которые записался пользователь.

$userRegisteredTo = Tournament::whereHas('users', function($query){
                $query->where('user_id', Auth::id());
            })->where('status', '1')->get();

Можно ли это считать жадной загрузкой?

Не в сети

Подвал раздела