2013-07-08 1 views
2

У меня есть модель, где я хочу загрузить две ссылки на другую таблицу (в данном случае posts.created_by_id == users.id и posts.updated_by_id == users.id).Можно ли комбинировать одноразовые нагрузки в Laravel 4?

class Post { 
    protected $table = 'posts'; 

    public function scopeLatest() { 
     return $query->with(['created_by', 'updated_by']) 
        ->orderBy('created_at', 'desc'); 
    } 

    public function createdBy() { 
     return $this->belongsTo('User'); 
    } 

    public function updatedBy() { 
     return $this->belongsTo('User'); 
    } 
} 

class User { 
    protected $table = 'users'; 

    public function posts() { 
     return $this->hasMany('Post', 'created_by'); 
    } 
} 

Это приводит к чему-то вроде следующих запросов:

SELECT * FROM tbl ORDER BY created_at DESC; 
SELECT * FROM users WHERE id IN (?); (created_at) 
SELECT * FROM users WHERE id IN (?); (updated_at) 

Это имеет смысл - мы загружаем все ссылочных записей в created_by, а затем updated_by - однако мы могли бы оптимизировать это совместить Иды делают один запрос до users.

Мой вопрос: это что-то Красноречивое в настоящее время поддерживает?

+0

Я думаю, нам нужна дополнительная информация. Каковы две модели? (Пользователи и ... tbl?). Какие данные вы хотите увидеть в результате? – fideloper

+0

Я думаю, что ваши отношения не будут работать таким образом. attribTo принимает дополнительные параметры, которые сообщают ему, по каким столбцам связывать таблицу. Если вы хотите получить всю информацию сразу, взгляните на создание объединений с Eloquent. То есть Post :: latest() -> join ('user', 'users.id', '=', 'posts.updated_by'); –

ответ

0

Не работает для меня. Кажется, что загруженная загрузка работает только для одного экземпляра таблицы. Для меня только одно из отношений было заполнено. Возможно, Eloquent использует имя таблицы в качестве указателя для активной загрузки. Он генерирует все запрошенные запросы загрузки, но только один будет заполнен.

мне пришлось разделить данные в разных таблицах только из-за этой проблемы (и не было времени, чтобы копаться, что глубоко в красноречивых код.)

0

Я думаю, что это то, что вы могли бы искать:

class Post { 
    protected $table = 'posts'; 

    public function scopeLatest($query) { 
     return $query->with('createdBy', 'updatedBy') 
       ->orderBy('created_at', 'desc'); 
    } 

    public function createdBy() { 
     return $this->belongsTo('User','created_by_id'); 
    } 

    public function updatedBy() { 
     return $this->belongsTo('User','updated_by_id'); 
    } 
} 

class User { 
    protected $table = 'users'; 

    public function postsCreated() { 
     return $this->hasMany('Post', 'created_by_id'); 
    } 

    public function postsUpdated() { 
     return $this->hasMany('Post', 'updated_by_id'); 
    } 
}