Laravel whereHas on multiple relationship

Кто-нибудь знает, может ли эта новая функция выполнять несколько отношений?

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

В этом примере мне бы хотелось получить результаты запроса, в которых название клуба (клубные отношения) - это Арсенал, а регион - Австралия (отношение территории)

$ret->with('territory')->with('homeClub')->with('awayClub');
    $ret->whereHas('territory',function( $query ){
            $query->where('region','Australia');
        })->whereHas('homeClub', function ( $query ) {
            $query->where('name', 'Arsenal' );
        })->orWhereHas('awayClub', function ( $query ) {
            $query->where('name', 'Arsenal' );
        });

При выполнении этого запроса результат не ограничивает территорию whereHas только клубами.

Может ли быть привязана цепь, чтобы отфильтровать результаты в предыдущем соотношении whereHas? Любые предложения, если нет?

спасибо

джон

Ответ 1

Да, возможно.

Сгенерированный SQL, вероятно, будет:

SELECT * FROM ... WHERE (territory constraint) AND (homeClub constratint) OR (awayClub constraint)

Это означает, что если awayClub constraint выполняется, линия будет восстановлена. Я думаю, вы хотите добавить скобки в сгенерированный sql:

SELECT * FROM ... WHERE (territory constraint) AND ((homeClub constratint) OR (awayClub constraint))

для этого вам нужно вложить оба запроса внутри где:

$ret->with('territory')->with('homeClub')->with('awayClub');
    $ret->whereHas('territory',function( $query ){
        $query->where('region','Australia');
    })
    ->where(function($subQuery)
    {   
        $subQuery->whereHas('homeClub', function ( $query ) {
            $query->where('name', 'Arsenal' );
        })
        ->orWhereHas('awayClub', function ( $query ) {
            $query->where('name', 'Arsenal' );
        });
    });

Ответ 2

Благодаря тому, что edi9999 был показан в правильном направлении, я не рассматривал группировку параметров

use главный объект-красноречивость анонимной функции, я разместил ограничение whereHas и orWhereHas на homeClub и awayClub, и это сделало трюк.

$ret->with('territory')->with('homeClub')->with('awayClub')->with('programme');

    $ret
        ->whereHas('territory',function( $query ) use ( $parameterValues ){
            $query->where('region', $parameterValues['region_names'] );
        })
        ->whereHas('season', function ( $query ) use ( $parameterValues ){
            $query->where('name', $parameterValues['season_names'] );
        })
        ->where( function( $subquery ) use ( $ret ){
            $ret->whereHas('homeClub', function ( $query ){
                $query->where('name','Arsenal' );
            } );
            $ret->orWhereHas('awayClub', function ( $query ){
                $query->where('name','Arsenal');
             });
        });

Ответ 3

Я не думаю, что вам нужно "с", поскольку есть "wherehas"

Model::whereHas('territory',function( $query ){
        $query->where('region','Australia');
    })->whereHas('homeClub', function ( $query ) {
        $query->where('name', 'Arsenal' );
    })->orWhereHas('awayClub', function ( $query ) {
        $query->where('name', 'Arsenal' );
    });