从数据透视表中获取特定列值

时间:2017-01-28 09:54:09

标签: php mysql laravel

问题

我有三张表,shopsproductsproduct_shop作为数据透视表。 ShopProduct使用belongsToMany(多对多)相关联。将新Product插入数据库时​​,在我的表单中,我可以为每个Shop指定价格。提交表单时,product_idshop_id's将以相关价格插入数据透视表中。

我的问题是,在指定shop_id时,如何仅从数据透视表中检索产品的价格?最终,我的目标如下所述,并且可能有更好的解决方案。

解释

此外,我需要这个的原因如下。我也有一个categories表。在我的index view我想做这样的事情:

@foreach($categories as $category) // All categories
    {{ $category->name }} // Display the name of the category

    @foreach($category->products as $product) // Loop through all related products for each category
        {{ $product->name }}
        {{ $product->price }}
    @endforeach

@endforeach

现在的诀窍是价格来自数据透视表。我想根据shop_id显示上述内容。理想情况下,我只想创建一个查询,在其中我选择我需要的所有内容,然后在我的foreach中使用该集合,因此我不必在视图中使用特定方法。所以基本上我需要的是:

select
    categories->with('products') // Select all categories while eager loading the products
    price // Collected from the pivot table where the shop_id is equal to the given shop_id

数据库表

CREATE TABLE `categories` (
`id`,
  `user_id`,
  `name`,
  `created_at`,
  `updated_at`
)

CREATE TABLE `shops` (
`id`,
  `user_id`,
  `name`,
  `created_at`,
  `updated_at`
)

CREATE TABLE `products` (
`id`,
  `user_id`,
  `category_id`,
  `name`,
  `created_at`,
  `updated_at`
)

CREATE TABLE `product_shop` (
`id`,
  `product_id`,
  `shop_id`,
  `price`,
  `created_at`,
  `updated_at`
)

理想的最终结果(包括从数据透视表中收集的价格):

with the price entered

4 个答案:

答案 0 :(得分:1)

在product.php(Model)文件中定义此关系

public function priceCol($shopId)
{
  return $this->belongsTo(ProductShop::class,'product_id')->where('shop_id',$shopId);
}

用于检索特定产品的价格

$product = Product::find(1);
$price = $product->priceCol($shopId)->price;

答案 1 :(得分:1)

使用雄辩:

$shop=Shop::where('id',$id)->first();
$shop->pivot->price;

另外,请确保在关系中使用->withPivot

public function products()
{
    return $this->belongsToMany('App\Product')->withPivot('price');;
}

答案 2 :(得分:1)

Product模型中定义此

public function shops () {
    return $this->belongsToMany(Shop::class)->wirhPivot('price'); 
}

然后你可以

Product::with('shops')->get();

要急切加载,结果集合将有价格

答案 3 :(得分:0)

最后想出来,不幸的是,上面的所有答案都不是我想要的100%。

public function price($shop_id)
{
    return $this->shops()->where('shop_id', $shop_id)->first()->pivot->price;
}