web-dev-qa-db-ja.com

クエリ関係の雄弁

私にはNewsモデルがあり、Newsには多くのコメントがあるため、Newsモデルでこれを行いました:

public function comments(){
    $this->hasMany('Comment', 'news_id');
}

しかし、trashedテーブルにフィールドcommentsもあり、ゴミ箱に入れられていないコメントのみを選択したいと思います。そう trashed <> 1。だから私はこのようなことをする方法があるのだろうか:

$news = News::find(123);
$news->comments->where('trashed', '<>', 1); //some sort of pseudo-code

上記の方法を使用する方法はありますか、または次のように書くだけですか?

$comments = Comment::where('trashed', '<>', 1)
    ->where('news_id', '=', $news->id)
    ->get();
23
Vuk Stanković

これらのいずれかがあなたのために働くはずです、あなたが最も好きなものを選んでください:

  1. 熱心なローディング。

    _$comments = News::find(123)->with(['comments' => function ($query) {
        $query->where('trashed', '<>', 1);
    }])->get();
    _

    use($param)メソッドを使用してクエリ関数にパラメーターを注入できます。これにより、実行時に動的クエリ値を使用できます。

  2. 遅延読み込み

    _$news = News::find(123);
    $comments = $news->comments()->where('trashed', '<>', 1)->get();
    _

しかし、あなたがおそらくやろうとしているのはソフト削除を処理することであり、Laravelにはそれを支援する組み込みの機能があります: http://laravel.com/docs/eloquent#soft-deleting

31
rmobis

rmobisの答えは私が必要としたものでしたが、現在のエラーをスローしますLaravel 5。連想配列として今:

$comments = News::find(123)->with(
    ['comments' => function ($query) {$query->where('trashed', '<>', 1);}]
);

それを理解するのに少し時間がかかりました、これが他の人を助けることを願っています。

Laravelのドキュメント(5.6)で詳細をご覧ください: https://laravel.com/docs/5.6/eloquent-relationships#querying-relations

16
glnemeth

雄弁なモデルファイルで簡単に実行できます。このようにしてください:

public function comments_with_deleted()
{
    return $this->belongsTo('Comments', 'id')->where('deleted', 1);
}

public function comments()
{
    return $this->belongsTo('Comments', 'id');
}

このように呼び出します:

// for show comments with deleted
$comments = News::find(123)->with('comments_with_deleted');

// for show comments without deleted
$comments = News::find(123)->with('comments');
7
antoniputra