2015-03-01 3 views
1

Мне интересно, как выполнить запрос вложенных отношений с ограничениями в Laravel 4.1.Laravel ORM вложенные отношения с ограничениями

Вот ссылка запрос, который работает:

$users = User::with("careers.specialty.faculty.university")->get(); 

Как вы можете видеть, есть несколько вложенных моделей (с различными типами отношения).

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

Что бы лучший (и самый простой) способ достижения этой цели?

Вот что я пробовал до сих пор, но кажется, что ограничения не принимаются во внимание (все пользователи возвращаются).

$users = User::with([ 
     'careers'=> function($query)use($levelInput){ 
       if ($levelInput ==""){ 
        $query->get(); 
       }else{ 
        $query->where('level','=',$levelInput)->get(); 
       } 
      }, 
     'careers.specialty'=> function($query)use($specialtyInput){ 
       if ($specialtyInput ==""){ 
        $query->get(); 
       }else{ 
        $query->where('name','like','%'.$specialtyInput.'%')->get(); 
       } 
      }, 
     'careers.specialty.faculty'=> function($query)use($facultyInput){ 
       if ($facultyInput ==""){ 
        $query->get(); 
       }else{ 
        $query->where('name','like','%'.$facultyInput.'%')->get(); 
       } 
      }, 
     'careers.specialty.faculty.university'=> function($query)use($universityInput){ 
       if ($universityInput ==""){ 
        $query->get(); 
       }else{ 
        $query->where('name','like','%'.$universityInput.'%')->get(); 
       } 
      } 
     ])->get(); 

EDIT: Вот решение, благодаря принятому ответу Максима Cierzniak в:

$users = User::whereHas('promos',function($q)use($levelInput,$specialtyInput,$facultyInput,$universityInput){ 
     $q->where('level','like','%'.$levelInput.'%')->whereHas('specialty',function($q)use($specialtyInput,$facultyInput,$universityInput){ 
      $q->where('name','like','%'.$specialtyInput.'%')->whereHas('faculty',function($q)use($facultyInput,$universityInput){ 
       $q->where('name','like','%'.$facultyInput.'%')->whereHas('universities',function($q)use($universityInput){ 
        $q->where('name','like','%'.$universityInput.'%'); 
       }); 
      }); 
     }); 
    })->get(); 

Ну, этот код выглядит очень некрасиво. Но он работает, и если у вас есть лучший вариант, не стесняйтесь делиться им :)

ответ

1

with работает таким образом, чтобы отношения с нетерпением загружались в базовую модель, которую вы ищете. В этом случае вы всегда будете получать все записи User, тогда Laravel попытается найти отношения для всех из них. Если вы хотите загрузить всех пользователей, у каких отношений есть какое-то ограничение, вы должны попробовать метод whereHas. Таким образом, если вы, например позвонить

$posts = Blog::whereHas('comments', function($query){ 
    $query->where('content', 'like', 'foo%'); 
})->get(); 

Таким образом, вы получите только Blog, которые имеют некоторые комментарии с content как обув. Надеюсь, это то, что вы ищете.

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