Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:使用一组列作为ID(SKU)_Php_Mysql_Laravel - Fatal编程技术网

Php MySQL:使用一组列作为ID(SKU)

Php MySQL:使用一组列作为ID(SKU),php,mysql,laravel,Php,Mysql,Laravel,我正在开发一个商品库存系统,在数据库设计方面遇到了一些问题 我的库存表列出了库存中的项目。 每个项目都是唯一的,并由类型为“x-y-z”的SKU进行标识,x,y,z是我的表格的字段 例如: 我需要能够按SKU查找项目,但还需要返回给定x、y或z的行 鉴于sku是冗余的,是否需要将sku与x、y、z一起存储 如果有办法避免这种情况,我将如何使用laravel按sku查找项目,如下所示: Item::find(sku); //sku has to be primary key 谢谢你的时间 是的,

我正在开发一个商品库存系统,在数据库设计方面遇到了一些问题

我的
库存
表列出了库存中的项目。 每个项目都是唯一的,并由类型为“x-y-z”的SKU进行标识,
x
y
z
是我的表格的字段

例如:

我需要能够按SKU查找项目,但还需要返回给定
x
y
z
的行

鉴于
sku
是冗余的,是否需要将
sku
x
y
z
一起存储

如果有办法避免这种情况,我将如何使用laravel按sku查找项目,如下所示:

Item::find(sku); //sku has to be primary key

谢谢你的时间

是的,如果它是多余的,那么您不需要它。这个词本身就意味着它。看看这个SQL:

SELECT * FROM inventory WHERE x||'-'||y||'-'||z = sku; 
sku是您正在寻找的价值。有时,它仍然可以是好的,因为性能


或者拆分字符串sku并比较x、y、z。

您也应该保存sku,除非您确定x、y、z或sku永远不会更改

无论如何,您可能不想保存SKU(在一列或单独的表中),在该单独的表中保存其他列(x、y、z),并通过自动递增INT来标识产品。(更多详情)

例如:

产品:

id | the_rest_of_your_product_columns
_____________________________________
1  | ...
2  | ...
产品详情:

product_id | x | y | z | ...
____________________________
1          | 2 | 3 | 4 | ...

如果愿意,可以使用视图定义x、y和z:

create table inventory (
    sku varchar(255) not null primary key
);

create view v_inventory as
    select sku, substring_index(sku, '-', 1) as x,
           substring_index(substring_index(sku, '-', 2), '-', 1) as y,
           substring_index(sku, '-', -1) as z
    from inventory;

然后,您可以访问
where
子句中的
x
y
z
值,该子句使用
v_inventory

为我,我将保留
sku
单独的列,并将
唯一索引添加到其中。您可以在迁移中执行此操作

$table->unique('sku');
来源


通常,Laravel会假定
id
是主列名,但您可以通过将此代码放入模型中来覆盖它

class Staff extends Model {

  protected $primaryKey = 'sku';

}
来源


覆盖后,可以使用
sku
查找产品
$item=item::find(sku)

我不知道Laravel是否允许,但MySQL允许在主键中有多个列:
主键(x,y,z)
如果这不适用于Laravel,我将删除它
class Staff extends Model {

  protected $primaryKey = 'sku';

}