2014-11-29 1 views
0

У меня есть отношения между двумя моделями. Вместо того, чтобы делать @foreach для просмотра каждого дочернего элемента в представлении, я хочу получить доступ к каждому ребенку вручную в зависимости от состояния, но не знаю, как этого добиться.Доступ к ребенку в модели

Родитель модель сниппет

public function childs() 
{ 
    return $this->hasMany('Child'); 
} 

Детский модель фрагмент

public function parent() 
{ 
    return $this->belongsTo('Parent'); 
} 

view.blade.php

@foreach ($parents as $parent) 
    @if ($parent->childs()->count() == 2) 
     {{ $parent->find(1)->childs()->where('corner', '=', 'A')->first()->id }} 
     and 
     {{ $parent->find(1)->childs()->where('corner', '=', 'B')->first()->id }} 
    @endif 
@endforeach 

Причина, почему я хочу сделать это, потому что всегда будет только 2 ребенка, я хочу показать их в определенном порядке, и я хочу поставить «и» слово между ними.

С этим случается, что это приводит к тому, что первый результат всех дочерних элементов в таблице соответствует условию, а не только дочерний элемент, который принадлежит выбранному родительскому элементу, который соответствует условию. Причина, по которой я помещаю first(), состоит в том, что я возвращаю несколько результатов, но на самом деле будет только один ребенок, который удовлетворяет условию.

Я уверен, что я слишком усложняю его, и должен быть более простой способ.

Спасибо за помощь!


Из ответа Mudonat это то, что я и сделал.

Родитель модель фрагмент

public function childs() 
{ 
    return $this->hasMany('Child'); 
} 

детская модель SNIPPET

public function parent() 
{ 
    return $this->belongsTo('Parent'); 
} 

public function scopeCorner($query, $corner) 
{ 
    return $query->whereCorner($corner)->first(); 
} 

view.blade.php

@foreach ($parents as $parent) 
    @if ($parent->childs()->count() == 2) 
     {{ $parent->childs()->corner('A')->id }} 
     and 
     {{ $parent->childs()->corner('B')->id }} 
    @endif 
@endforeach 

ответ

0

Вы можете использовать области, чтобы сделать его немного проще . http://laravel.com/docs/4.2/eloquent#query-scopes

+0

Это работает. Это просто кажется неэффективным. У меня уже есть родительская модель, загруженная в память, и у этого должен быть ребенок уже, зачем идти на запрос? – gonza182

+0

Eloquent не делает запросы на соединение. Он делает запросы, когда им нужно. Лучше перенести подобные действия на класс модели. Я рекомендовал области, потому что, по крайней мере, с ними, код будет немного понятнее. – mudonat

+0

Спасибо за ваш ответ. У меня нет достаточного количества голосов, чтобы проголосовать за ответ. – gonza182