Получить все записи из модели, которые НЕ имеют записи в сводной таблице Laravel 5

Я пытаюсь понять, как добиться следующего. Я искал и искал безрезультатно.

У меня есть сводная таблица в приложении Laravel 5, которая работает, как и ожидалось, со следующими функциями в соответствующих моделях.

// Module.php
//...
public function sites()
{
    return $this->belongsToMany('App\Site')->withPivot('enabled');
}

// Site.php
//...
public function modules()
{
    return $this->belongsToMany('App\Module')->withPivot('enabled');
}

Я могу получить все соответствующие записи с помощью чего-то вроде следующего в моем Sitecontroller.php

$site = Site::with('modules')->findOrFail($id);

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

Может ли кто-нибудь указать в правильном направлении, как я могу добиться чего-то подобного, правильным образом (я могу придумать несколько способов, но кажется действительно хакерским)

Заранее спасибо. М


person madmatuk    schedule 20.02.2015    source источник


Ответы (1)


В этом случае запуск запроса со стороны Module и исключение со стороны whereDoesntHave должны работать:

$id = 1;
$modules = Module::whereDoesntHave('sites', function($q) use ($id){
    $q->where('site_id', $id);
})->get();
person lukasgeiter    schedule 20.02.2015
comment
Привет, Лукас, теперь я чувствую себя глупо :). Думаю, моя новизна засияла :) Это отлично сработало. - person madmatuk; 21.02.2015
comment
Не чувствуйте себя глупо ;) whereDoesntHave это скорее один из продвинутых трюков Eloquent и, к сожалению, он тоже не упоминается в документации... - person lukasgeiter; 21.02.2015
comment
Наверное, да, я ничего не мог найти в контексте моих критериев поиска, мы живем и учимся. Еще раз спасибо Лукас. - person madmatuk; 21.02.2015
comment
Это лучший ответ, чем использование метода «не в отношении» или «существует». Спасибо - person Tarunn; 15.07.2015