【问题标题】:Laravel Eloquent JOIN over multiple tablesLaravel Eloquent JOIN 在多个表上
【发布时间】:2015-02-02 14:29:30
【问题描述】:

我在 JOIN 超过 2 个表时遇到问题。其中之一与 Eloquent 模型“消息”没有直接关联。

我的表:

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');
}

消息.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()

所以我得到了带有关联表“视频”和“用户”的消息数据。

我现在的问题:我在这个命令中还需要videos_languages,它与消息模型无关。

是否可以将其包含在 top 命令中并使用 Video 模型中的 languages() 关系?

【问题讨论】:

  • 你可以用点嵌套模型:->with('messageVideos.languages','messageUser')->first();这行得通吗?
  • 嗨,Björn,谢谢,这行得通。但是有可能在命令中为语言添加 where 条件吗?现在我得到了与视频相关的所有语言,但在一个方法中,我只想要 id 为 1 的语言。
  • 我相信你现在需要 whereHas laravel.com/docs/4.2/eloquent#querying-relations ,你可以嵌套它们。
  • 嵌套它不起作用,它说 messageVideos.languages 未定义:@user2094178 $message->where('m_to','=',12345)->with('messageVideos.languages','messageUser')->whereHas('messageVideos.languages',function($q) { $q->where('id','=','1'); })->first()
  • whereHas 不支持messageVideos.languageslanguages 必须有自己的whereHas 并嵌套在messageVideoswhereHas 中。

标签: php mysql laravel laravel-4


【解决方案1】:

我认为您不需要“whereHas”,而是需要“Eager Load Constraints”。 这可以在 laravel 文档中的 eager loading 下找到。

例如:

$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();

【讨论】:

    猜你喜欢
    • 2020-10-25
    • 2015-05-17
    • 2020-06-27
    • 2018-01-17
    • 2020-06-06
    • 2019-08-02
    • 2014-11-17
    • 2018-04-12
    • 2018-12-14
    相关资源
    最近更新 更多