Laravel雄辩的查询使用两个关系

时间:2019-02-23 22:18:48

标签: php laravel laravel-5 laravel-5.7

我有下一个数据库结构-产品可以在很多类别中,产品可以在很多市场中。模型\App\Product\App\Market\App\Category具有多对多关系-belongsToMany()

enter image description here

class Product extends Model
{
    public function categories()
    {
        return $this->belongsToMany('App\Category');
    }

    public function markets()
    {
        return $this->belongsToMany('App\Market');
    }
}

class Category extends Model
{
    public function products()
    {
        return $this->belongsToMany('App\Product');
    }
}

class Market extends Model
{
    public function products()
    {
        return $this->belongsToMany('App\Product');
    }
}

route.web中,我得到了要显示产品的类别

Route::get('/catalog/{current_category?}', 'CatalogController@index')->name('catalog.index');

我可以从会话中获得的当前市场(用户在打开网站时选择市场)

$market = $request->session()->get('market'); // or Session::get('market');
// $market->id
// $market->slug

在我的MarketController@index中,我想从路线中获取所有类别的产品,并从会话中获取当前市场的所有产品。但是我该怎么办呢?我可以得到分类产品和市场产品。但是,如何同时获得类别和市场产品?

public function index(Request $request, Category $current_category = null)
{
    if ($current_category) {

        $market_id = $request->session()->get('market')->id;

        $products = $current_category->products;
        // ...
    }
}

2 个答案:

答案 0 :(得分:2)

如果要基于类别的产品,请使用以下查询:

$products = $current_category->products()->get();

如果要基于市场的产品,首先需要获得市场对象,而不是基于市场的产品。

$market =  Market::find($market_id);
$market_products = $market->products()->get();

如果要根据市场和类别选择产品,可以在下面的查询中使用。

$products = Product::whereHas('categories', function($q) {
                        $q->where('category_id', $current_category->id);
                     })
                     ->whereHas('markets', function($q) {
                        $q->where('market_id', $market_id);
                     })
                     ->get();

答案 1 :(得分:0)

正如评论中指出的那样,您可以通过多对多态关系来实现它

  • 表结构
categories
    id - integer
    name - string

markets
    id - integer
    name - string

products
    id - integer
    name - string

productables
    product_id - integer
    productable_id - integer
    productable_type - string
  • 类别模型
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    /**
     * Get all of the products for the category.
     */
    public function products()
    {
        return $this->morphToMany('App\Product', 'productable');
    }
}
  • 市场模型
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Market extends Model
{
    /**
     * Get all of the products for the market.
     */
    public function products()
    {
        return $this->morphToMany('App\Product', 'productable');
    }
}
  • 产品型号
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    /**
     * Get all of the categories that are assigned this product.
     */
    public function categories()
    {
        return $this->morphedByMany('App\Category', 'productable');
    }

    /**
     * Get all of the markets that are assigned this product.
     */
    public function markets()
    {
        return $this->morphedByMany('App\Market', 'productable');
    }
}

使用以下方式可以获得属于特定类别和特定市场的产品:

$products = \App\Product::where(['productable_id' => $category->id, 'productable_type' => get_class($category)])->orWhere(['productable_id' => $market->id, 'productable_type' => get_class($market)])->get();

假设您的问题是已知类别和市场。

@YasinPatel的解决方案也应该起作用,但是这样,您的数据库体系结构将更加灵活。现在由您决定。研究多态关系解,您会发现它很有趣。