Laravel8 hasManyで条件を指定する方法

例えば記事(articles)とカテゴリ(categories)テーブルがあって以下のようなリレーションになっているとする。

categories     articles
  id -----┐      id
          └----- category_id
                 status

まず、カテゴリからそのカテゴリに属する全ての記事を取得する場合は、hasMany()で取得できる。

// call側
$articles = $category->articles;

// model側
public function articles()
{
    $articles = $this->hasMany(Article::class);
    return $articles;
}

statusが1のレコードのみを取得したい場合は、hasMany()にwhere句を追加すればよい。

public function articles()
{
    $articles = $this->hasMany(Article::class)->where('status', '=', 1);
    return $articles;
}

動的にstatusの値を指定して取得する場合は、パラメータで渡してhasMany()にwhere句を追加すればよい。

// call側
$articles = $category->articles($status);
// model側
public function articles($status)
{
    $articles = $this->hasMany(Article::class)->where('status', '=', $status);
    return $articles;
}

または、hasMany()には手を加えず、コール元でwhere句を追加してもよい。

// call側
$articles = $category->articles->where('status', '=', $status);
// model側
public function articles()
{
    $articles = $this->hasMany(Article::class);
    return $articles;
}

返信を残す

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