gpt4 book ai didi

php - MySQL (Laravel Eloquent) - 当两列同时有两个或多个值时获取记录

转载 作者:行者123 更新时间:2023-12-04 14:14:27 27 4
gpt4 key购买 nike

我有从 this post 获得的这个数据库管理产品及其变体:

+---------------+     +---------------+
| PRODUCTS |-----< PRODUCT_SKUS |
+---------------+ +---------------+
| #product_id | | #product_id |
| product_name | | #sku_id |
+---------------+ | sku |
| | price |
| +---------------+
| |
+-------^-------+ +------^------+
| OPTIONS |------< SKU_VALUES |
+---------------+ +-------------+
| #product_id | | #product_id |
| #option_id | | #sku_id |
| option_name | | #option_id |
+---------------+ | value_id |
| +------v------+
+-------^-------+ |
| OPTION_VALUES |-------------+
+---------------+
| #product_id |
| #option_id |
| #value_id |
| value_name |
+---------------+

问题是,当用户选择他想要的产品选项时,我不知道如何获得 SKU:

SKU_VALUES
==========
product_id sku_id option_id value_id
---------- ------ --------- --------
1 1 1 1 (W1SSCW; Size; Small)
1 1 2 1 (W1SSCW; Color; White)
1 2 1 1 (W1SSCB; Size; Small)
1 2 2 2 (W1SSCB; Color; Black)

假设用户选择 ID 为 1 的产品和选项 size-small 和 color-black,我如何才能获得 sku_id(在这种情况下我希望值 2 来自sku_id) 以获得 PRODUCT_SKUS 表中的价格。

由于显而易见的原因,我不能做这样的事情:

SELECT sku_id FROM SKU_VALUES 
WHERE (SKU_VALUES.option_id = 1 AND SKU_VALUES.value_id = 1)
AND (SKU_VALUES.option_id = 2 AND SKU_VALUES.value_id = 2)

请注意,我似乎需要附加与产品可用选项数量相同数量的条件(或任何我需要的条件),在这种情况下只有 2 行,因为该产品有 2 个选项(尺寸和颜色),但产品可能有“n”个选项。

如果有人可以指导我进行此查询,并且可以使用 Laravel Eloquent 而不是使用 RAW 查询来完成,我将不胜感激。

我创建的模型如下:

“产品”型号:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Producto extends Model
{
protected $table = 'productos';

protected $fillable = [
'nombre',
'descripcion'

];

public function opciones(){
return $this->hasMany('App\Models\OpcionProducto', 'producto_id');
}

public function skus(){
return $this->hasMany('App\Models\ProductoSku', 'producto_id');
}
}

“选项”模型:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use App\Traits\HasCompositePrimaryKey;

class OpcionProducto extends Model
{
use HasCompositePrimaryKey;

protected $table = 'productos_opciones';

protected $primaryKey = array('producto_id', 'opcion_id');

protected $fillable = [
'producto_id',
'opcion_id',
'nombre_opcion',
'valor'
];


public function producto(){
return $this->belongsTo('App\Models\Producto', 'producto_id');
}

public function valores(){
return $this->hasMany('App\Models\OpcionValorProducto', 'opcion_id', 'opcion_id');
}

public function skusValores(){
return $this->hasMany('App\Models\SkuValor', 'opcion_id', 'opcion_id');
}
}

“选项值”模型:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use App\Traits\HasCompositePrimaryKey;

class OpcionValorProducto extends Model
{
use HasCompositePrimaryKey;

protected $primaryKey = array('producto_id', 'opcion_id', 'valor_id');

protected $table = 'productos_opciones_valores';

protected $fillable = [
'producto_id',
'opcion_id',
'valor_id',
'valor_variacion',
'valor'
];


public function producto(){
return $this->belongsTo('App\Models\Producto', 'producto_id');
}

public function opcion(){
return $this->belongsTo('App\Models\OpcionProducto', 'opcion_id', 'opcion_id');
}
}

“Product_SKUS”型号:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use App\Traits\HasCompositePrimaryKey;

class ProductoSku extends Model
{
use HasCompositePrimaryKey;

protected $primaryKey = array('producto_id', 'sku_id');

protected $table = 'productos_skus';

protected $fillable = [
'producto_id',
'sku_id',
'imagen_id',
'precio',
'stock',
'sku'
];


public function producto(){
return $this->belongsTo('App\Models\Producto', 'producto_id');
}

public function valoresSku(){
return $this->hasMany('App\Models\SkuValor', 'sku_id');
}

}
}

“SKU_VALUES”型号:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

use App\Traits\HasCompositePrimaryKey;

class SkuValor extends Model
{
use HasCompositePrimaryKey;

protected $primaryKey = array('producto_id', 'sku_id', 'opcion_id');

protected $table = 'valores_skus';

protected $fillable = [
'producto_id',
'sku_id',
'opcion_id',
'valor_id',
];


public function producto(){
return $this->belongsTo('App\Models\Producto', 'producto_id');
}

public function opcion(){
return $this->belongsTo('App\Models\OpcionProducto', 'opcion_id', 'opcion_id');
}

public function sku(){
return $this->belongsTo('App\Models\ProductoSku', 'sku_id', 'sku_id');
}
}

最佳答案

在回答了您的问题后,这是我想出的代码。当然这是未经测试的。请试一试。

$skuValor = SkuValor::with('producto', 'opcion.valores', 'sku')
->whereHas('producto', function ($q) use ($request) {
$q->where('id', $request->get('product_id')); // id: 1
})
->whereHas('opcion', function ($q) use ($request) {
$q->whereIn('id', $request->get('option_ids')) // id: [1, 2] where 1=size, 2=color
->whereHas('valores', function($q2) use ($request) {
$q2->whereIn('id', $request->get('value_ids')); // id: [1, 3] where 1=small, 3=pink
});
})
->get();

$skuValor->sku->id; // sky id

with() :这叫做 Eager Loading .在检索模型时加载一些关系。

whereHas():Querying Relationship Existence .此方法允许您将自定义约束添加到关系约束。

use() :传递数据以便内部(特定的)查询可以使用它。请注意,我们使用 1 表示 opcion,另一个表示 valores。

whereIn() :此方法验证给定列的值是否包含在给定数组中。

如果遇到困难,请发表评论。

关于php - MySQL (Laravel Eloquent) - 当两列同时有两个或多个值时获取记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61803433/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com