Модель user
может иметь 0 или более foo
и может иметь 0 или более bar
.Вот диаграмма:
Существует следующее правило : если у пользователя есть какой-либо столбец, то это означает, что онимеет foo с id=1
.Пользователь не может иметь foo с id=1
без бара.Чтобы предотвратить несогласованность базы данных, в foo_user
никогда не вставляется строка с foo_id = 1
, поскольку она уже подразумевается таблицей bar_user
.
В Laravel я могу получить все foo
изпользователь, подобный этому:
public foos()
{
$this->belongsToMany('App\Foo');
}
Проблема в том, что из-за вышеупомянутого правила, foo
с id = 1
может отсутствовать.Есть ли простой способ настроить мой метод отношений foos
, чтобы он проверял, существует ли bar_user
, а затем добавьте foo
с помощью id=1
?Я хотел бы получить правильные foos с одним запросом и со связями, поэтому я могу использовать это как \App\User::whereHas('foos', ...)
Это то, что я пытался
Запрос на получение всех foo
\DB::table('foos')
->leftjoin('foo_user', 'foo.id', 'foo_user.foo_id')
->where('foo_user.user_id', '=', $this->id);
->orWhereRaw('EXISTS (select * from bar_user WHERE user_id = ?) AND foos.id = 1', [$this->id]);
Я не могу выполнить
public foos()
{
$this->belongsToMany('App\Foo')
->orWhereRaw('EXISTS (select * from bar_user WHERE user_id = ?) AND foos.id = 1', [$this->id]);
}
, потому что есть innerjoin
в belongsToMany
, а не leftjoin
,