Расширенный поиск в базе данных запроса - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть 2 таблицы в базе данных MySQL. «Продукты» и «Технические характеристики». Таблица продуктов содержит информацию о продуктах. И «Технические характеристики» содержат спецификацию продукта. Но спецификации являются динамическими c, значит, каждый продукт будет иметь различные типы спецификаций. Ниже приведены некоторые примеры данных.

Products table
=============
id      name
---------------------
1       Product A
2       Product B


Specifications table
====================
id      product_id      spec_type       value
-------------------------------------------------
1       1               condition       new     
2       1               color           blue
3       1               size            large
4       2               condition       new
5       2               color           red
6       2               location        local
7       2               fragile         yes

Теперь, когда пользовательский поиск с условием "условие = новый", в результате должны появиться оба продукта A и B. Но когда поиск «условие = новый И цвет = синий», в результате должен появиться продукт А.

Мне нужна помощь в построении оператора SQL. Я работаю над проектом Laravel, поэтому, если я получу Laravel запросов, это будет бонусом.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2020

Предполагая, что вы уже определили отношения между Product и Specification.

class Product extends Model
{
    ...
    public function specifications()
    {
        return $this->hasMany(Specification::class, 'product_id', 'id');
    }
}

Тогда вы можете применить несколько whereHas к запросу продукта:

// Use this one, both product A and B should come as the result
// $array = ['condition' => 'new']; 
// Use this one, product A should come as a result.
$array = ['condition' => 'new', 'color' => 'blue']; 

Product::where(function($query) use ($array) {
    foreach($array as $key => $val) {
        $query->whereHas('specifications', function($q) use ($key, $val) {
            $q->where(['spec_type' => $key, 'value' => $val]);
        });
    }
})->get();
0 голосов
/ 13 апреля 2020

Вы должны использовать Eloquent для легкого достижения этого

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    public function specifications()
    {
        return $this->hasMany(Specification::class);
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Specification extends Model
{
    public function scopeSpecType($query, $specType)
    {
        return $query->where('spec_type', $specType);
    }

    public function scopeValue($query, $value)
    {
        return $query->where('value', $value);
    }
}
<?php

use App\Product;


$newProducts = Product::with(['specifications' => function ($query) {
    $query->specType('condition')->value('new');
}])->get();

$blueProducts = Product::with(['specifications' => function ($query) {
    $query->specType('color')->value('blue');
}])->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...