Laravel leftJoin с замкнутым соединением в реляционной таблице - PullRequest
0 голосов
/ 03 сентября 2018

Таблица:

- salon_clients: id, salon_id, client_id
- clients: id, name, phone
- client_calls: id, salon_id, phone

Динамическая переменная: $salonID

Логика (текст):

Мне нужно принять все вызовы из client_calls для определенного салона на основе параметров salon_id и телефона, выполнить левое соединение по телефону в таблице клиентов, чтобы взять имя клиента в случае совпадения, а также при закрытии левого соединения выполнить внутреннее соединение с проверьте, совпадает ли клиент с таблицей salon_client из этого салона с помощью clients.id = salon_clients.client_id, где user_id = $ userID.

Логика (код):

return ClientCall::leftJoin('clients', function($query) use ($salonID){
        $query->on('client_calls.phone', 'clients.phone');

        $query->join('salon_clients', function($query) use ($salonID){
            $query->on('clients.id', 'salon_clients.client_id');
            $query->where('salon_clients.salon_id', $salonID);
        });
    })
    ->where('client_calls.salon_id', $salonID)
    ->orderBy('client_calls.created_at', 'DESC')
    ->select(
        'client_calls.*',
        'clients.name'
    )
    ->get();

Return:

[
    {
        "id": 5,
        "salon_id": 1,
        "phone": "0746707241",
        "type": "missed",
        "created_at": "2018-09-02 10:36:45",
        "updated_at": "2018-09-02 10:39:32",
        "name": 'Test client',
    }
]

Проблема заключается в том, что тестовый клиент не относится к salon_id 1 (имя должно быть NULL в этом случае). Итак, внутреннее соединение +, где условие просто переходит.

Я что-то упустил? Еще раз спасибо за вашу помощь!

1 Ответ

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

попробуйте

return ClientCall::leftJoin('clients', function($query) use ($salonID){
    $query->on('client_calls.phone', 'clients.phone');
})
->join('salon_clients', function($query) use ($salonID){
        $query->on('clients.id', 'salon_clients.client_id');
        $query->where('salon_clients.salon_id', $salonID);
})
->where('client_calls.salon_id', $salonID)
->orderBy('client_calls.created_at', 'DESC')
->select(
    'client_calls.*',
    'clients.name'
)
->get();
...