Эквивалентность оператора AND в операторе ON (JOIN) в EloquentORM - PullRequest
0 голосов
/ 04 ноября 2019

Посмотрите на запрос ниже:

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' ?
    }
}

Проблема в том, что я не знаю, как определить AND s.language = 'en' в EloquentORM. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Вы можете определить отношение и затем использовать 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

Если вы просто хотите использовать объединение, вы можете использовать его следующим образом

$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 присоединиться

1 голос
/ 04 ноября 2019

Вы можете добавить предложение 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;
...