Количество запросов от выбранных данных в соединительной таблице - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь получить все комбинации product_categories и фильтров, а также количество фильтров, выбранных для каждого продукта.

Я могу получить комбинации, но у меня возникают проблемы с получением правильного количества.Я работаю в Laravel и использую \ DB :: raw Query.

Это то, что я получил до сих пор:

\DB::raw("SELECT product_categories.*,filters.name as filter, filter_types.heading as filter_type
                FROM product_categories, filters
                JOIN filter_types ON filter_types.id = filters.filter_type_id
                WHERE filter_types.type = 'Modules\\\DonaldRussell\\\ProductCategories\\\App\\\ProductCategory'
                ORDER BY product_categories.name, filter_type
                ");

Схема БД выглядит следующим образом:

Schema::create('filter_types', function(Blueprint $table) {
        $table->increments('id');
        $table->string('type')->notNull();
        $table->string('heading')->notNull();
        $table->timestamps();
    });

Schema::create('filters', function(Blueprint $table) {
        $table->increments('id');
        $table->integer('filter_type_id')->unsigned()->notNull();
        $table->foreign('filter_type_id')->references('id')->on('categories_types');
        $table->string('name')->notNull();
        $table->integer('order')->notNull();
        $table->integer('uses')->unsigned()->notNull()->default(0);
        $table->timestamps();
    });

Schema::create('product_categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name')->notNull();
        $table->string('slug')->notNull();
        $table->integer('order')->notnull()->unsigned()->default(0);
        $table->integer('type')->notnull()->unsigned()->default(1);
        $table->integer('seo')->nullable()->unsigned();
        $table->foreign('seo')->references('id')->on('seos')->onDelete('cascade');
        $table->timestamps();
    });

Schema::create('product_category_sets', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('category_id')->nullable()->unsigned();
        $table->foreign('category_id')->references('id')->on('product_categories')->onDelete('set null');
        $table->integer('sub_category_id')->nullable()->unsigned();
        $table->foreign('sub_category_id')->references('id')->on('tags')->onDelete('set null');
        $table->integer('sub_sub_category_id')->nullable()->unsigned();
        $table->foreign('sub_sub_category_id')->references('id')->on('tags')->onDelete('set null');
        $table->integer('product_id')->notnull()->unsigned();
        $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
        $table->timestamps();
    });

Schema::create('product_category_set_filters', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('product_category_set_id')->notnull()->unsigned();
        $table->foreign('product_category_set_id')->references('id')->on('product_category_sets')->onDelete('cascade');
        $table->integer('filter_id')->notnull()->unsigned();
        $table->foreign('filter_id')->references('id')->on('filters')->onDelete('cascade');
        $table->timestamps();
    });

На приведенном ниже снимке экрана показан нужный мне результат без столбца подсчета, который я не могу получить: enter image description here

1 Ответ

0 голосов
/ 05 октября 2018

Прежде всего, я не думаю, что ваша структура правильная, но давайте предположим, что это так.

Нам нужно 4 модели: ProductCategorySet::class, Product::class, Category::class (product_category) и Filter::class.

При правильных отношениях между ними вы сможете сделать

ProductCategorySet::with('product')->with('category')->withCount('filters')->get();

, и это будет все, что вам нужно.

use Illuminate\Database\Eloquent\Model;

class ProductCategorySet extends Model
{
    public function product()
    {
        return $this->belongsTo(Product::class);
    }

    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function filters()
    {
        return $this->belongsToMany(Filter::class, 'product_category_set_filters', 'product_category_set_id', 'filter_id');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...