看看下面的查询:
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'
。
任何帮助表示赞赏。
答案 0 :(得分:1)
您可以在关系中添加where子句:
public function subtitle()
{
return $this->hasOne(Subtitles::class, 'subtitle_id', 'video_id')->whereLanguage('en');
}
获取模型:
假设您更改了视频模型的primaryKey
属性:
protected $primaryKey = 'video_id';
您可以执行以下操作:
$video = Video::findOrFail(1000);
$subtitle = $video->subtitle;
答案 1 :(得分:1)
您可以定义关系,然后使用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
如果您只想使用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