Laravel 雄辩地将所有ID传递给作用域,而不是当前ID

Laravel 雄辩地将所有ID传递给作用域,而不是当前ID,laravel,laravel-4,eloquent,Laravel,Laravel 4,Eloquent,我的视图中有2个循环: @foreach($products as $product) ... @foreach($product->pricesOrder() as $price) ... @endforeach ... @endforeach 我的产品模型中的pricesOrder()范围如下所示: p

我的视图中有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都不同且不重复

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


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

如果要删除作用域,请使用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;
}

删除作用域,在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;
}

删除作用域,在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;
}

删除作用域,在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;
}

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

1:将其设置为静态函数,并将产品id作为参数传递,然后使用
product::scopePricesOrder($product\u id)
获取查询结果:

2:只需将产品id传递给scope函数,并使用
$product->priceOrder()


3:如果你只是想使用当前的产品id,Ezra的答案很好。

好吧,似乎有多种方法可以实现你的目标

1:将其设置为静态函数,并将产品id作为参数传递,然后使用
product::scopePricesOrder($product\u id)
获取查询结果:

2:只需将产品id传递给scope函数,并使用
$product->priceOrder()


3:如果你只是想使用当前的产品id,Ezra的答案很好。

好吧,似乎有多种方法可以实现你的目标

1:将其设置为静态函数,并将产品id作为参数传递,然后使用
product::scopePricesOrder($product\u id)
获取查询结果:

2:只需将产品id传递给scope函数,并使用
$product->priceOrder()


3:如果你只是想使用当前的产品id,Ezra的答案很好。

好吧,似乎有多种方法可以实现你的目标

1:将其设置为静态函数,并将产品id作为参数传递,然后使用
product::scopePricesOrder($product\u id)
获取查询结果:

2:只需将产品id传递给scope函数,并使用
$product->priceOrder()


3:如果您只是想使用当前的产品id,Ezra的回答很好。

作用域应该使您的查询代码可读且灵活,而不必返回一些相关数据。因此,不要在此处使用范围,而是使用“简单方法”或创建关系:

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

作用域应该使查询代码具有可读性和灵活性,而不必返回一些相关数据。因此,不要在此处使用范围,而是使用“简单方法”或创建关系:

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

作用域应该使查询代码具有可读性和灵活性,而不必返回一些相关数据。因此,不要在此处使用范围,而是使用“简单方法”或创建关系:

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

作用域应该使查询代码具有可读性和灵活性,而不必返回一些相关数据。因此,不要在此处使用范围,而是使用“简单方法”或创建关系:

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

你知道那是OP回答了他自己的问题,对吗?:)哈哈。我没有注意到……我在回答他的问题时正在做其他事情……你知道那是OP回答了他自己的问题,对吗?:)哈哈。我没有注意到……我在回答他的问题时正在做其他事情……你知道那是OP回答了他自己的问题,对吗?:)哈哈。我没有注意到……我在回答他的问题时正在做其他事情……你知道那是OP回答了他自己的问题,对吗?:)哈哈。我没有注意到……我在回答他的问题时正在做其他事情。。。