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 环境找到等效的数据检索操作。
所以,我的选择是:
- 使用数据库外观
- 使用查询生成器
- 在
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'
。
任何帮助表示赞赏。
您可以在关系中添加 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;
您可以定义关系然后使用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
看看下面的查询:
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'
。
任何帮助表示赞赏。
您可以在关系中添加 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;
您可以定义关系然后使用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