【问题标题】:The equivalence of the AND statement in a ON statement (JOIN) in EloquentORMEloquentORM 中 ON 语句 (JOIN) 中 AND 语句的等价性
【发布时间】:2019-11-04 08:34:05
【问题描述】:

看看下面的查询:

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

  • 使用 DB 门面
  • 使用查询生成器
  • 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'。 任何帮助表示赞赏。

【问题讨论】:

    标签: laravel eloquent eloquent-relationship


    【解决方案1】:

    您可以在关系中添加 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;
    

    【讨论】:

    • 我不知道 Eloquent 能够像这样处理where。你能提供一个官方文档页面来解释where 在你使用它的方式中的用法吗?我在网上找不到。
    • 我认为文档中没有解释,但偶尔会使用它,例如here。您可以找到使之成为可能的代码here
    【解决方案2】:

    你可以定义关系然后使用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();
    

    查看laraveljoin

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2021-04-02
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      相关资源
      最近更新 更多