【问题标题】:eloquent passing all IDs to scope, not the current one雄辩地将所有 ID 传递给范围,而不是当前的
【发布时间】:2015-01-13 17:39:16
【问题描述】:

我认为有 2 个循环:

        @foreach($products as $product)

           ...

                @foreach($product->pricesOrder() as $price)

                ...

                @endforeach

           ...

        @endforeach

我的 Product 模型中的 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 不同且不重复。

我曾假设因为在 $product 上调用了 pricesOrder(),所以它只会打赌获取该单个产品的查询。不是所有的人。

在范围内运行 dd($product); 将返回所有产品,而不是当前产品。

【问题讨论】:

    标签: laravel laravel-4 eloquent


    【解决方案1】:

    范围应该使您的查询代码具有可读性和灵活性,而不必返回一些相关数据。所以不要在这里使用范围,而是使用你的“简单方法”或者创建关系:

    // 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)
    

    【讨论】:

      【解决方案2】:

      删除范围,在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;
      }
      

      【讨论】:

        【解决方案3】:

        嗯,似乎有多种方法可以实现您的目标。

        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 的回答就可以了。

        【讨论】:

        • 您确实意识到那是 OP 回答他自己的问题,对吧? :)
        • 哈哈。我没有注意到...我在回答他的问题时正在处理其他事情...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 2014-08-14
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        相关资源
        最近更新 更多