【问题标题】:how to filter records filtered by more than one criterion in pivot table - laravel eloquent collections如何过滤数据透视表中由多个标准过滤的记录 - laravel eloquent collections
【发布时间】:2015-02-24 06:25:51
【问题描述】:

我正在改造一个图书推荐个人网站。我想按多个标准过滤图书。

例如,我想显示所有既是哲学又是科幻小说的书籍。彼得瓦特的盲视就是一个例子。

现在我只能做一个标准过滤器:

我有一个用于

的数据透视表

示范书

public function genres()
{
    return $this->belongsToMany('App\Genre', 'bookgenres', 'book_id', 'genre_id');
}

模型类型:

public function books()
{
    return $this->belongsToMany('App\Book', 'bookgenres', 'genre_id', 'book_id');
}

数据透视表 bookgenres 示例: id,book_id,genre_id

1 - 23 - 4

2 - 23 - 5

3 - 24 - 4

简而言之:第 23 本书既是 SF(#4)又是哲学(#5),而第 24 本书只是 SF(#4)

有了这些,我只是查询

$genre = 4;
$books = Genre::find($genre)->books()->get();

并使用标准的@foreach 循环列出书籍


要做的事情:按两种类型过滤集合,而不是一种。

提前致谢!

【问题讨论】:

  • 我认为您将不得不为此使用连接。有枢轴查询功能,但我怀疑它们是否可以按照您的意愿使用。但如果你想尝试,就像Book::wherePivot('genre_id', 'someId')->wherePivot('genre_id', 'someOtherId')->get()

标签: laravel filter eloquent relationship


【解决方案1】:

可以查询whereHas的关系

这里我使用了流派的名称。如果你愿意,你也可以使用 id。只需更改列名和数组即可。

$genres = array('philosophy', 'science-fiction');
$books = Book::whereHas('genres', function($query) use ($genres){
    $query->whereIn('name', $genres);
})->get();

【讨论】:

  • 谢谢!这是一个很大的帮助!我能把你的注意力引向这个吗:stackoverflow.com/questions/27653323/…
  • 不客气。我会看看它。不过看起来工作量很大...... ;)
  • @lukasgeiter 我无法接受答案......我没有问这个问题。 :p 但我确实赞成。
  • @nhbjgfcxhgchg 哈哈哈我的错 :P 以为你是 OP...不过感谢您的支持 :)
  • @nhbjgfcxhgchg 感谢您的建议!也许你可以看看这个:stackoverflow.com/a/27653700/4209866我现在在自己的答案中被困在问题 4 - 数据透视表的附加过滤器
猜你喜欢
  • 2017-10-17
  • 2017-02-28
  • 2013-09-03
  • 2021-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
相关资源
最近更新 更多