EloquentORM中ON语句(JOIN)中AND语句的等效

看看下面的查询:

SELECT v*,s.* 
FROM videos v
INNER JOIN subtitles s ON (s.subtitle_id = v.video_id AND s.language = 'en')
WHERE v.video_id = 1000

我想为Laravel / Eloquent ORM环境找到等效的数据检索操作。 因此,我的选择是:

  • 使用数据库外观
  • 使用查询生成器
  • Video模型中定义关系

假设我希望使用后者(如果可能)。

namespace App\Models\v1;

use App\Models\v1\Subtitles;
use Illuminate\Database\Eloquent\Model;

class Video extends Model
{
    protected $table = 'videos';

    public function subtitle()
    {
        return $this->hasOne(Subtitles::class,'subtitle_id','video_id'); // How can I define the AND s.language = 'en' ?
    }
}

这里的问题是我不知道如何在EloquentORM中定义AND s.language = 'en'。 任何帮助表示赞赏。

duoluoyouhun 回答:EloquentORM中ON语句(JOIN)中AND语句的等效

您可以在关系中添加where子句:

public function subtitle()
{
    return $this->hasOne(Subtitles::class,'subtitle_id','video_id')->whereLanguage('en');
}

获取模型:

假设您更改了视频模型的primaryKey属性:

protected $primaryKey = 'video_id';

Docs

您可以执行以下操作:

$video = Video::findOrFail(1000);
$subtitle = $video->subtitle;
,

您可以定义关系,然后使用whereHas

public function subtitle()
{
    return $this->hasOne(Subtitles::class,'video_id');
}

然后像这样过滤它

$video = Video::where('video_id',1000)->whereHas('subtitle',function($query){
  $query->where('language','en');
})->first();

有关详细信息,请检查doc

  

如果您只想使用join,则可以这样使用

$lang = 'en';

$video = Video::where('video_id',1000)
        ->join('subtitles',function ($join) use ($lang){
             $join->on(function ($query) use ($lang) {
                $query->on('subtitles.subtitle_id','=','videos.video_id');
                $query->on('subtitles.language',DB::raw($lang));
             });
        })->first();

检查laravel join

本文链接:https://www.f2er.com/3168195.html

大家都在问