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のデータが抽出されます。