EloquentORM中ON语句(JOIN)中AND语句的等价性

The equivalence of the AND statement in a ON statement (JOIN) in EloquentORM

看看下面的查询:

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 环境找到等效的数据检索操作。 所以,我的选择是:

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

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'。 任何帮助表示赞赏。

您可以在关系中添加 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, 'subtitle_id', 'video_id');
}

然后像这样过滤

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

有关详细信息,请查看 doc

If you just want to use join then you can use it like this

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

勾选laraveljoin