2013-06-23 5 views
2

Можно ли отфильтровать результирующий набор в Eloquent ORM Laravel с помощью соответствующих моделей? Я понимаю, что Красноречивый не присоединиться к таблицам, но результаты, которые я хотел бы быть похожи на:Фильтрация релевантных отношений

SELECT * FROM билетов РЕГИСТРИРУЙТЕСЬ статусы на tickets.status_id = statuses.id WHERE statuses.name = «Закрыто «;

Ближайшая функциональность я нашел в красноречива:

$tickets = Ticket::with(array('status' => function($q) { 
    return $q->where('name', '!=', 'Closed'); 
}))->get(); 

Это будет возвращать все билеты, но только относительно статусов, если имя не закрывается.

Кроме того, я знаю, что это может быть сделано в Fluent, но я хотел бы работать с возвращаемой структуры вложенных объектов, Красноречивым обеспечивает:

echo ticket->status->name; 

Fluent возвращает сплюснутый результат в объединенном запрос будет.

ответ

1

Мне кажется, что я пытался сделать это слишком сложным.

$statuses = Status::where('name', '!=', 'Closed')->list('id'); 
$tickets = Ticket::with('status')->whereIn('status_id', $statuses)->get(); 

Или я мог бы направление Статусы ... что я не хочу делать, но это уменьшит мой счет запросов:

$statusTickets = Status::with('ticket')->where('name', '!=', 'Closed')->get(); 
0

Возможно, вы сможете определить отношения hasOne ('status') в своей модели и использовать это , но я лично не пытался это сделать.

+0

Билет принадлежит статусу билета, который имеет статус_ид. У статусов много билетов. – dhudson

2

Кажется, этот вопрос старый, но в случае, если вы смотрите в реальный ответ здесь, мы должны стараться изо всех сил, чтобы избежать запросов к базе данных слишком много, принято отвечать делать это дважды, но вы можете сделать это одним выстрелом

$tickets = Ticket::with('status')->whereHas('status', function($q) { 
    return $q->where('name', '!=', 'Closed'); 
})->get();