2016-11-22 5 views
3

У меня есть типичный метод hasMany:Eloquent - как добавить участие в отношениях hasMany?

public function earmarks() { 
    return $this->hasMany('App\Earmark'); 
} 

Но как же я добавить присоединиться и некоторые другие условия в этих отношениях, когда я использую ->with('earmarks'), чтобы получить их? Я хочу добавить:

->join('locations', 'locations.id', '=', 'earmarks.location') 
->select('earmarks.*', 'locations.location AS em_location') 
->orderBy('date', 'asc'); 
+0

Не был бы проще ли просто создать 'hasOne()' отношение 'location' на' earmarks'? 'return $ this-> hasOne ('location') -> orderBy ('date', 'ASC');' – jcorry

+0

Так что бы получилось от «Ноутбука» с («earmarks») ... тогда что , чтобы вытащить отношения с местоположением earmark? – daninthemix

+0

Извините, похоже, что это hasMany/принадлежит к отношениям между местоположениями и earmarks. Но то же самое относится. Просто настройте свои отношения между адресами и местоположениями, и вы можете получить к ним доступ, как вы делаете какие-либо связанные элементы. – jcorry

ответ

2

ОК, понял, мне нужно закрыть в моей статье with(), как это:

$updated_laptops = Laptop::with([ 
     'earmarks' => function($q) { 
      $q 
      ->join('locations', 'locations.id', '=', 'earmarks.location') 
      ->select('earmarks.*', 'locations.location AS em_location') 
      ->orderBy('date', 'asc'); 
     } 
    ])->addJoins()->selectListCols()->find($request->IDs)->keyBy('id'); 
1

Когда вы определили метод hasMany в модели Location (например \ App \ Models \ Location.php)

public function earmarks() { 
    return $this->hasMany('App\Earmark'); 
} 

Вы можете вернуть объект Расположение в контроллере (например LocationController.php):

public function show($id) 
{ 
    $location = \App\Models\Location::find($id); 
    return view('locations.show) 
    ->with('location', $location); 
} 

Тогда в представлении (например Места \ show.blade.php), вы можете получить данные, как это:

@foreach ($location->earmarks->sortBy('date') as $earmark) 
    <p>{{ $earmark->attribute_name }}</p> 
@endforeach 
+0

Я на самом деле не работаю с представлениями, я просто возвращаю JSON. '$ updated_laptops = Laptop :: with ('earmarks') -> addJoins() -> selectListCols() -> find ($ request-> IDs) -> keyBy ('id');' - этот код делает то, что я необходимо ЗА ИСКЛЮЧЕНИЕМ Мне нужны эрманки, чтобы получить местоположение. Так что почти что-то вроде «Laptop :: with ('earmarks') -> with ('location.location')' - хотя я предполагаю, что это будет иметь отношение к ноутбукам, а не к earmarks. – daninthemix

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