我的观点中有2个循环:
@foreach($products as $product)
...
@foreach($product->pricesOrder() as $price)
...
@endforeach
...
@endforeach
和我的产品型号中的pricesOrder()范围如下:
public function scopePricesOrder($query)
{
$product = $query->first();
$prices = Price::join('sites as site', 'site.id', '=', 'prices.site_id')
->orderBy('site.order', 'asc')
->select('prices.*')
->where('product_id', $product->id)
->get();
}
我遇到的问题是传递给范围的查询是所有产品,而不是单个产品。
或者至少我认为发生了什么,因为循环的结果是所有行输出完全相同,即第一个的内容,这意味着范围始终是相同的的productID。即使每个产品ID都是差异的,也不会重复。
我曾假设因为priceOrder()在$ product上被调用,它只会下注获取该单个产品的查询。不是所有的人。
在示波器中运行dd($product);
将返回所有产品,而不是当前产品。
答案 0 :(得分:2)
范围应该使您的查询代码可读且灵活,而不是必须返回一些相关数据。所以不要在这里使用范围,而是采用您的简单方法'或者改为建立关系:
// Product model
public function pricesOrdered($direction = 'asc')
{
$direction = ($direction == 'desc') ? 'desc' : 'asc';
return $this->hasMany('Price')
->join('sites', 'sites.id', '=', 'prices.site_id')
->select('prices.*')
->orderBy('sites.order', $direction);
}
然后你可以像任何关系一样使用它:
foreach ($product->pricesOrdered as $price)
// and reverse the order if necessery
foreach ($product->pricesOrdered('desc')->get() as $price)
答案 1 :(得分:1)
删除范围,在Product.php模型中使用常规方法
public function pricesOrder()
{
$prices = Price::join('sites as site', 'site.id', '=', 'prices.site_id')
->orderBy('site.order', 'asc')
->select('prices.*')
->where('product_id', $this->id)
->get();
return $prices;
}
答案 2 :(得分:0)
好吧,似乎有多种方法可以实现您的目标。
1:将其设为静态函数并将产品ID作为参数传递,并使用Product::scopePricesOrder($product_id)
获取查询结果:
`public static function scopePricesOrder($product_id)
{
$prices = Price::join('sites as site', 'site.id', '=', 'prices.site_id')
->orderBy('site.order', 'asc')
->select('prices.*')
->where('product_id', $product_id)
->get();
}`
2:只需将产品ID传递给范围函数,然后使用$product->priceOrder()
`public function scopePricesOrder($query, $product_id)
{
$prices = Price::join('sites as site', 'site.id', '=', 'prices.site_id')
->orderBy('site.order', 'asc')
->select('prices.*')
->where('product_id', $product_id)
->get();
}`
3:如果您只想使用当前产品ID,Ezra的答案可以正常使用。