Несколько соединений с условиями - PullRequest
0 голосов
/ 20 апреля 2020

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

Мои таблицы:

Users
------
id, name, location, type (musician or band)

Bands:
id, user_id, experience

Musicians:
id, user_id, experience, commitment

Мой запрос должен возвращать всех пользователей (группы или музыкантов) из указанного c местоположения где уровень опыта равен «новичку».

// get users
$query = User::select(['id','name','location','type']);

// get bands with experience beginner
$filteredBands = Band::select('user_id', 'id')->where('experience', 'beginner');

// join bands with users
$query->joinSub($filteredBands, 'filtered_bands', function($join) use($data) {
   $join->on('users.id', '=', 'filtered_bands.user_id');
});

// Load the band so I get the nice model structure from laravel
$query->with('band');

// Do the same for Musicians
$filteredMusicians = Musician::select('user_id', 'id')->where('experience', 'beginner');
$query->joinSub($filteredMusicians, 'filtered_musicians', function($join) use($data) {
   $join->on('users.id', '=', 'filtered_musicians.user_id');
});
$query->with('musician');

var_dump($query->get());

Моя проблема в том, что он получает пользователей только там, где сделаны оба соединения, где я хотел бы одно или другое. Есть ли концепция orJoin или что-то подобное?

Спасибо!

1 Ответ

2 голосов
/ 20 апреля 2020

Я написал этот запрос, который возвращает Пользователь с Band или Музыкант (одна имеет значение, а другая равна нулю).

User::where('location','Aus')->with(['band' => function ($query) {
        $query->select('*')->where('experience','beginner');
    }])->with(['musician' => function ($query) {
        $query->select('*')->where('experience','beginner');
    }])->get;

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...