1つのModelからリレーション先の検索ORカラム検索にヒットしたデータを抽出 / Eloquent/with/orWhere

LaravelのEloquentを利用して、複数の条件でデータ抽出をします。下記の① OR ② の抽出です。

①:Modelのカラムから条件を指定
②:リレーション先の条件を指定

・利用するシチュエーション

例えば、検索窓を設置した場合。
「映画タイトル」OR「映画のハッシュタグ」どちらかにヒットさせる検索窓にする場合などです。

・Model

Movie Model と Tag Model それを繋ぐリレーションを記載しています。

①:Movie Model

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Movie extends Model
{
    use HasFactory;

    protected $fillable = [
        'movie_title',
    ];

    public function tags()
    {        
        return $this-->hasMany(Tag::class);
    }    
}

②:Movie Tag

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    use HasFactory;

    protected $fillable = [
        'tag_name',
        'movie_id',
    ];

}

Controllerの処理

実際にControllerで抽出する条件を書いていきます。

public function search($words)
{
    
    $movie = Movie::with('tags')
    ->whereHas('tags', function ($query) use ($words) {
            return $query->where('tag_name', "LIKE", "%".$words."%");
        })
    ->orWhere('movie_title', "LIKE", "%".$words."%")
    ->get();

    return $movie;

}

・リレーション先の条件を抽出する with 
・Or条件で抽出する orWhere
を併用することで、実装可能です。

検索窓に、映画のタイトルを検索しても、ハッシュタグを検索しても、どちらかにヒットする movie Modelのデータが抽出されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です