2014-11-18 4 views
0

У меня есть следующий Laravel Eloquent код, где будет много метод построения цепочки:Eloquent Объект - Метод Chaining

$foo = EloquentFoo::orderBy('xyz'); 

if(true) 
{ 
    $foo->whereHas('eloquentModel',function($q){ 
     return $q->where('name','=','john'); 
    }); 
} 

Учитывая сложные условия, мне нужно создать экземпляр Красноречивого Query Builder без использования «OrderBy» или любые другие статические методы.

Я попытался использовать следующую команду, которая с треском проваливается (не знаю почему):

$foo = new EloquentFoo; 
+0

http://stackoverflow.com/a/23599775/358906 и другой ответ под ним. –

+0

Спасибо, но я уже пробовал; и это не сработало. – Mysteryos

ответ

2
// get the query 
$fooQuery = EloquentFoo::query(); 

// chain methods  
if (whatever) $fooQuery->whateverMethod(); 

// execute 
$fooQuery->get(); 
+0

Ответ на вопрос :) Спасибо! – Mysteryos

0

Простой способ вокруг: Я сравниваю свой первичный ключ к чему-то несуществующий (не является оптимальным решением), было бы интересно посмотреть другие решения, хотя я думал, что это может помочь:

$foo = EloquentFoo::where('id','!=','0'); // id is the primary key and there is no row with value 0 
// so basically above I am searching everything 
// Perform Chaining Operation 
if(true) 
{ 
    $foo->whereHas('eloquentModel',function($q){ 
     return $q->where('name','=','john'); 
    }); 
} 

Примечание: вы можете использовать идентификатор, как много раз в цепочке, как вы хотите, и это будет работать:

EloquentFoo::where('id','!=','0')->where('id','!=','0')->get() 

Надеюсь, это поможет (я знаю, что это совсем не ОПТИМАЛЬНО).

+1

Хехе, я добавил 'whereNull ('deleted_at')', чтобы обойти проблему. Ярек дал правильный способ сделать это выше :) – Mysteryos

+0

Да, ответ выглядит более перспективным .. спасибо за вопрос :) –

Смежные вопросы