我有产品和目录的模型。他们有很多关系,因此我使用名为' items'的数据透视表。我有一条路线:
/something/something/{catalogue}/{product}
我将产品模型和目录模型传递给视图,该视图输出产品信息和目录信息 - 非常简单。现在我需要2个按钮 - ' next'和之前的'浏览目录中的产品。
所以有一种方法可以做到这一点,我想我会在Catalog模型上创建两个方法来接受当前的产品模型,并根据ID返回next / prev模型:
public function prevProduct($product){
$prevProdId = Product::where('id', '<', $product->id)->max('id');
return Product::find($prevProdId);
}
public function nextProduct($product){
$nextProdId = Product::where('id', '>', $product->id)->min('id');
return Product::find($nextProdId);
}
现在这很好用,但正如您所看到的,它从数据库中的Product表中检索下一个产品和以前的产品,而不是目录。
要获取目录中的所有产品,可以这样完成:$this->items (on Catalogue model) or $catalogue->items (from view).
我不知何故需要从目录中获取next / prev项目,但无法弄清楚如何。任何建议都会非常感激。
答案 0 :(得分:0)
您可以过滤收集,如下所示:
$next = $item->id + 1;
$catalogue->filter(function($item) use ($next ) {
return $item->id == $next;
})->first();
我使用添加到Collection类的全局方法:
/**
* Returns first object from collection which meets attribute criteria
*
* @param string $attributeName name of attribute we are looking for
* @param string $attributeValue value of attribute that have to be met
* @return \Illuminate\Database\Eloquent\Collection
*/
public function findByAttribute($attributeName, $attributeValue)
{
return $this->filter(function($item) use ($attributeName, $attributeValue) {
return $item->{$attributeName} == $attributeValue;
})->first();
}
在这种情况下,我会这样使用这种方法:
$catalogue->items->findByAttribute('id', $next);
在这两个例子中,我假设你有$item
对象要求。
答案 1 :(得分:0)
您可以使用Pagination
Catalogue::first()->items()->paginate(1);
答案 2 :(得分:0)
实际上,它要简单得多。这就是诀窍:
$nextProdId = $this->items()->where('product_id', '>', $product->id)->min('product_id');
return Product::find($nextProdId);
我必须在&#39; item&#39;之后添加()启用&#39; where&#39;条款并使其基本可搜索。