2017-02-05 3 views
2

INFORMATIONSLaravel Eloquent - колонка OrderBy найти в соответствующей модели

База данных

events  | id | to_user_id | from_user_id | 
event_details | id | event_id  | when   | 

Event.php

class Event extends Eloquent { 

protected $table = 'events'; 

public function event_detail() { 
    return $this->hasOne('EventDetail'); 
}} 

EventDetail.php

class EventDetail extends Eloquent { 

protected $table = 'event_details'; 

public function event() { 
    return $this->belongsTo('Event', 'event_id'); 
}} 

ВОПРОС

Я хочу получить все события (модель события) и заказать столбцы «когда» в связанной модели EventDetail. Я написал запрос, и она работает:

$event = Event::join('event_details as p', 'p.event_id', '=', 'event.id') 
        ->orderBy('p.when', 'asc') 
        ->select('events.*') 
        ->with('event_detail') 
        ->get(); 

но когда я хотел бы добавить ->where('to_user_id', '=', 0) статьи я получаю ошибку. Как это исправить?

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

ответ

2

Хорошо, пришлось воссоздать ваш проект/таблицы Все тесты работают правильно, но я заметил несколько вещей, которые вы можете рассмотреть.

$events = Event::with(['event_detail'=> function($query) { 
    $query->orderBy('when', 'asc'); 
}]) 
->where('to_user_id', 0) 
->get(); 

Кроме того, ваш код может быть лучше, если у Вас есть событие

public function event_detail(){ 
    //considering you will have multiples? or just the one event detail? 
    return $this->hasMany('EventDetail'); 
} 

Как вы можете видеть, одно событие, я сохранил есть 2 детали событий & все они отсортированы по ASC. enter image description here

Вы можете использовать другой метод, который не использует 'with()', но я предпочитаю его. Очень приятно для результатов json, где вы можете использовать множество связанных моделей.

Надеюсь, что это поможет

+1

К сожалению, orderBy не работает. –

+1

После редактирования ... снова выглядит так, как будто он должен работать, но orderBy не работает :-( –

+0

Приятно, что вы ищете лучшее из кодирования. Я могу восхищаться этим :) –

0

Я решил проблему с этим вопросом. Я хотел бы добавить ->where('events.to_user_id', '=', 0) так

$event = Event::join('event_details as p', 'p.event_id', '=', 'event.id') 
       ->orderBy('p.when', 'asc') 
       ->select('events.*') 
       ->where('events.to_user_id', '=', 0) 
       ->with('event_detail') 
       ->get(); 

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

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