2014-09-02 2 views
0

У меня есть пакетная модель, которая имеет множество результатов и принадлежит к проекту. Текущий статус партии основан на статусе последнего результата. Так, в моей пакетной модели у меня есть это:Eager load single item with Eloquent принадлежитToMany

public function allForProject($pid) 
{ 
    $batches = $this 
     ->with(static::$relatedObjects) 
     ->with('current_status') 
     ->where('project_id', '=', $pid) 
     ->get(); 
    return $batches; 
} 

public function current_status() 
{ 
    return $this 
     ->belongsToMany('BehatEditor\Models\Result') 
     ->orderBy('created_at', 'DESC') 
     ->limit(1) 
     ; 
} 

... Так что, говоря «-> с („CURRENT_STATUS“)» Я пытаюсь нетерпеливый нагрузки только самый последний результат для этой партии - там может быть тысячами из них за каждую партию, которую я не хочу возвращать на передний план.

Теперь это не сломается, но «limit (1)» фактически ограничивает количество партий, которые возвращаются с результатом. Хотя каждый из моих партий имеет 2 результата с моими тестовыми данными, когда я использую limit (1), только один из них возвращается с любыми данными. Когда я использую limit (2), только две партии возвращаются с единственной записью current_status (желательно), а остальные имеют пустой массив для current_status.

Это проект Silex с использованием Eloquent как ORM, поэтому специальные методы Laravel не будут работать.

Любая помощь очень ценится!

UPDATE:

Похоже, красноречивый просто не поддерживает это. см. http://irclogs.julien-c.fr/2013-12-19/01:48#log-52b25061a599aafb54008650. Я хотел бы обновить свой вопрос: как я могу чисто добавить необработанный SQL, который мне нужен для моего запроса? Могу ли я предоставить свой собственный метод, который содержит только необходимый SQL, или мне нужно заменить все использование ORM в allForProject()?

+0

Действительно ли это 'принадлежит ToMany' или' hasMany', как вы говорите в своем 1-м абзаце? –

+0

@crypticsymbols - ваше обновление по-прежнему применимо или оно было реализовано в Laravel? – djt

ответ

0

Вместо ->limit(1), используйте ->first().

Обновление: Неправильное то, что вы сказали, это должно сработать.

+0

Хмм ... это бросает вызов на неопределенный метод Illuminate \ Database \ Query \ Builder :: addEagerConstraints() ". – crypticsymbols

+0

Нет, это не сработает. –