雄辩地将所有ID传递到范围,而不是当前ID

时间:2015-01-13 01:19:57

标签: laravel laravel-4 eloquent

我的观点中有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);将返回所有产品,而不是当前产品。

3 个答案:

答案 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的答案可以正常使用。