2016-04-13 3 views
2

У меня есть таблица Posts, она имеет три поля id,, description.Laravel eloquent получить все записи wherehas все идентификаторы во многих отношениях много

Мой Post Модель

class Post extends Model 
{ 
    use SoftDeletes; 

    protected $fillable = ['title', 'description']; 

    public function tags() 
    { 
     return $this->belongsToMany(Tag::class, 'post_tag'); 
    } 
} 

Мой Tag Модель

class Tag extends Model 
{ 
    use SoftDeletes; 

    protected $fillable = ['name']; 

    public function posts() 
    { 
     return $this->belongsToMany(Post::class, 'post_tag'); 
    } 
} 

Теперь я хочу, чтобы получить Сообщений & разбивать на страницы, где у меня есть тег фильтра, например, у меня есть две метки animals & news, который имеет идентификатор 1 & 2. Я хочу получить все сообщения с меткой 1 & 2 & paginate. Вот что я пытался

 Post:: with('tags')->whereHas('tags', function($q) { 
      $q->whereIn('id', [1, 2]); 
     })->paginate(); 

Но вот как я whereIn возвращает сообщения имеет метки 1 или 2 или both. Но я хочу, у кого есть оба тега id 1 & 2.

Я использую Laravel 5.2.

ответ

2

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

$query = Post::with('tags'); 
foreach ($ids as $id) { 
    $query->whereHas('tags', function($q) use ($id) { 
     $q->where('id', $id); 
    }); 
} 
$query->paginate(); 
+1

благодаря @Joel он работал на меня, я дам вверх голос, но так как я зацикливание над ним я буду ждать лучшего ответа. Спасибо чувак. –

+0

Это справедливо. Рад, что это помогло. :) –

0

Я не думаю, что есть встроенный метод для этого, но я бы предложил поставить цикл Еогеаспа внутри метода whereHas только ради опрятности.

$query = Post::with('tags')->wherehas('tags', function ($q) use ($ids) { 
    foreach ($ids as $id) { 
     $q->where('id', $id); 
    } 
})->paginate(10); 
+0

Вы пробовали этот @alexleonard? Я пробовал это раньше, но это не сработало. –

0

Я смотрел на то же самое и вдохновленный this stackoverflow MySQL answer, я закончил с этим

Код:

Post:: with('tags')->whereHas('tags', function($q) { 
    $idList = [1,2]; 
    $q->whereIn('id', $idList) 
     ->havingRaw('COUNT(id) = ?', [count($idList)]) 
})->paginate(); 

Потому что я думаю, я мог бы использовать его в несколько мест, которые я сделал в черту, которую вы можете сделать view here. Что, если бы вы включили эту черту в свой класс Post, вы могли бы использовать, как показано ниже.

Код:

Post::with('tags')->whereHasRelationIds('tags', [1,2])->paginate(); 
Смежные вопросы