2014-12-04 4 views
0

У меня возникли проблемы с JOIN за 2 столами. Один из них напрямую не связан с моделью «Послание».Laravel Eloquent JOIN за несколькими столами

Мои таблицы:

videos 
-- id 
-- file 

messages 
-- m_id 
-- m_type 
-- m_video 

videos_languages 
-- video_id 
-- language_id 

У меня есть следующие модели:

User.php 
Video.php 
Message.php 

Video.php имеет следующее соотношение:

public function languages() 
{ 
    return $this->belongsToMany('Language','videos_languages','video_id','language_id')->withPivot('titel','vl_id'); 
} 

message.php

public function messageVideos() 
{ 
    return $this->belongsTo('Video','m_video','id'); 
} 

public function messageUser() 
{ 
    return $this->belongsTo('Visitor','m_from','v_id'); 
} 

В моем основном сценарии, я следующая команда:

$message = new Message(); 
$message->where('m_to','=',12345)->with('messageVideos','messageUser')->first() 

Так я получаю данные сообщения с соответствующими таблицами «Видео» и «Пользователем».

Моя проблема сейчас: мне также нужны видео_языки в этой команде, и она не связана с моделью сообщения.

Возможно ли включить его в верхнюю команду и использовать отношение languages ​​() от модели видео?

+0

Вы можете вложить модели с, с точкой: -> с ('messageVideos.languages', 'messageUser') -> первый(); Это работает? –

+0

Привет, Бьорн, спасибо, что работает. Но возможно ли добавить условие для языка в команде? Теперь у меня есть все языки, связанные с видео, но в одном mthod мне нужен только язык с идентификатором 1. – user2891491

+0

Теперь я верю, что вам понадобится whereHas http://laravel.com/docs/4.2/eloquent#querying-relations, вы можете их вложить. – user2094178

ответ

0

Я не думаю, что вам нужно «whereHas», но «Eager Load Constraints». Это находится под eager loading в документах laravel.

Для примера:

$users = User::with(array('posts' => function($query) 
{ 
    $query->where('title', 'like', '%first%'); 
}))->get(); 

Вы, однако, должны гнездиться Оно и нагрузить больше отношения.

Так как это:

$message = Message::where('m_to','=',12345) 
->with(array('messageVideos.languages' => function($query) 
{ 
    $query->where('language_id', '=', 2); 
}, 
'messageUser'))->first(); 
Смежные вопросы