Laravel Query Builder - удаление или изменение соединения - PullRequest
0 голосов
/ 10 мая 2019

У меня есть объект Builder, содержащий соединение left, которое я хочу условно превратить в соединение inner. Как удалить или изменить существующее объединение?

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Это немного некрасиво, но это работает.

$query = App\User::leftJoin('tableX', 'tableX.user_id', 'users.id');

if ($some_condition) {
    foreach( $query->getQuery()->joins as $key => $join) {
        /** @var \Illuminate\Database\Query\JoinClause $join */
        if ($join->table == 'tableX') {
            unset($query->getQuery()->joins[$key]);
        }
    }
    $query->join('tableX', 'table.user_id', 'users.id');
}
0 голосов
/ 10 мая 2019

Я принял ответ Диого , но я также обнаружил, что могу также редактировать существующее объединение. Его решение показывает, как извлечь объект \Illuminate\Database\Query\Builder из объекта \Illuminate\Database\Eloquent\Builder. У меня уже есть Query Builder, поэтому я написал свою функцию так:

/**
 * @param \Illuminate\Database\Query\Builder $query
 * @param string $table
 * @param string $type
 */
private function changeJoinType(\Illuminate\Database\Query\Builder $query, string $table, string $type): void
{
    foreach ($query->joins as $join) {
        if ($join->table === $table) {
            $join->type = $type;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...