人気のPHP WEBアプリケーションフレームワークLaravelのTipsを記録していきます

Laravelでリレーション先のカラムを文字列で検索する

● Laravelでリレーション先のカラムを文字列で検索する

1対1のリレーションに有効です。
1対多のリレーションの場合は Slow Query になる可能性があるようです。必ず生成されるSQL文を確認しましょう。

● モデル

    /**
     * 1対1リレーション (従属の関係)
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function user() // 単数形
    {
        return $this->belongsTo('App\User');
    }

● コントローラー

(モデルの中に記述してもいいです。お好みで。)

whereHasメソッド または orWhereHasメソッド を使用します。

// ● リレーション先のユーザー名「太郎」でも検索
$q = '太郎';
$model->orWhereHas('user', function ($query) use ($q) {	// リレーション名 user を渡す
    $query->where('name', 'LIKE', "%{$q}%");
});

● 実行されるSQL

WHERE
exists(select * from users
    where articles.user_id = users.id
    and name LIKE '%太郎%')

exists を使ってサブクエリを呼び出します。

● 1対多の場合は 最適化されないクエリで呼ばれるようです。遅いです。

● Laravel WhereHas を早くする

パッケージのインストール

composer require mpyw/eloquent-has-by-join
composer require mpyw/eloquent-has-by-non-dependent-subquery
No.1397
06/07 16:10

edit