2013-11-17 9 views
11

У меня есть News модель и News имеет много комментариев, так что я сделал это в News модели:Запрос Eloquent

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(); 

ответ

12

Любой из них должен работать на выберете тот, который вам больше всего нравится:

  1. Eager-loading.

    $comments = News::find(123)->with('comments', function ($query) { 
        $query->where('trashed', '<>', 1); 
    }); 
    
  2. Ленивой загрузка

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

Я не мог не заметить, однако, что то, что вы, вероятно, пытаетесь сделать, это обрабатывать мягкое удаление, и что У Laravel есть встроенные функции, которые помогут вам в этом: http://laravel.com/docs/eloquent#soft-deleting

+0

Я реализовал мягкое удаление, но мне также нужны комментарии, не опубликованные, но не удаленные. У меня есть опция удаления –

3

Вы можете сделать это просто в красноречивом режиме l файл. сделать так:

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'); 
8

rmobis «s ответ был, что мне нужно, но он выдает ошибку в текущем Laravel 5. Вы должны использовать его в качестве теперь имеется ассоциативный массив:

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

Пришло время понять это, надеясь, что это поможет другим.

Смежные вопросы