2017-01-24 10 views
0

У меня есть этот запрос:Как использовать тот же самый красноречивый запрос дважды, но с одним другим предложением where?

User::leftJoin('friends', function ($join) { 
    $join->on('friends.user_id_1', '=', 'users.id') 
     ->orOn('friends.user_id_2', '=', 'users.id'); 
}) 
->where(function ($query) use ($myID) { 
    // Group orwhere functions so the query builder knows these belong together 
    $query->where([ 
     'friends.user_id_1' => $myID, 
     'friends.accepted' => true 
    ]) 
    ->orWhere([ 
     'friends.user_id_2' => $myID, 
     'friends.accepted' => true 
    ]); 
}) 
->where('users.id', '!=', $myID) // Exclude the user with id $myID 
->get(); 

https://stackoverflow.com/a/41832867/5437864

Я хочу использовать этот запрос в два раза, но с другой, где положение. Можно ли повторно использовать этот запрос без копирования всего кода? И если да, то как?

+0

да, да. – nogad

+0

@nogad Спасибо, но как? :) – Z0q

+0

Пожалуйста, включите хотя бы часть содержимого ссылки в ваше сообщение, иначе ссылка может быть неактуальной с течением времени, и вопрос станет непонятным – Icarus

ответ

0
$query = User::leftJoin('friends', function ($join) { 
    $join->on('friends.user_id_1', '=', 'users.id') 
     ->orOn('friends.user_id_2', '=', 'users.id'); 
}) 
->where(function ($query) use ($myID) { 
    // Group orwhere functions so the query builder knows these belong together 
    $query->where([ 
     'friends.user_id_1' => $myID, 
     'friends.accepted' => true 
    ]) 
    ->orWhere([ 
     'friends.user_id_2' => $myID, 
     'friends.accepted' => true 
    ]); 
}); 

Добавление дополнительных, где существующий запрос

$query->where('users.id', '!=', $myID) 


$query->get(); 

Проверить эту ссылку для другого примера

Example

+0

Это не работает. Другая ссылка использует построитель запросов. – Z0q

+0

Он не дает никаких ошибок, но он применяет 2 фильтра к одному и тому же запросу вместо одного фильтра на копию. Я использовал ключевое слово 'clone' (см. Мой ответ). – Z0q

+0

Я не понимаю вас, собственно, что вы имеете в виду. Но вы сделали то же самое, с более длинным путем. Нет двух фильтров. Вы можете каждый раз добавлять некоторые условия к основному «$ query», который я предоставил. – Rashad

0

Я использовал PHP клон keyword. Я не уверен, что это лучшее решение, но это помогает. Любые другие предложения приветствуются.

$friends_query = User::leftJoin('friends', function ($join) { 
    $join->on('friends.user_id_1', '=', 'users.id') 
     ->orOn('friends.user_id_2', '=', 'users.id'); 
}) 
->where(function ($query) use ($myID) { 
    // Group orwhere functions so the query builder knows these belong together 
    $query->where([ 
     'friends.user_id_1' => $myID, 
     'friends.accepted' => true 
    ]) 
    ->orWhere([ 
     'friends.user_id_2' => $myID, 
     'friends.accepted' => true 
    ]); 
}); 

$friends_me = clone $friends_query; 
$friends_me = $friends_me->where('users.id', '!=', $myID); 

$friends_others = clone $friends_query; 
$friends_others = $friends_others->where('users.id', '=', $myID);