我正在实现两个对象,例如HotDog和Burger,它们都是Food的子类。
我正在使用的系统将用于创建HotDog和Burger,可能还有其他类型的Food,但绝不会用于创建通用的“ Food”对象。
餐饮
class Food{
//some fields
protected $cooked_by;
protected $use_before_date;
}
热狗:
class HotDog extends Food{
//some fields specicifc to HotDog
private $sauage_type;
}
汉堡包
class Burger extends Food{
//some fields specicifc to Burger
private $burger_type;
}
这些模型具有对应的数据库表,即食物,热狗和汉堡。
如果我想选择由某位负责人烹制的所有HotDog,当前我必须像下面这样遍历HotDog的每一行:
SELECT food_id FROM hotdog
然后遍历整个结果集,对每一行都执行以下操作:
SELECT * FROM food WHERE food_id = x AND cooked_by=chief0001
希望您了解我正在尝试在此处构建的结构。当前必须获取每个HotDog行的所有food_id,然后从食物表中一个接一个地进行选择会严重影响性能。
能够做的很好:
SELECT * FROM hotdog WHERE cooked_by = chief0001
但是,正如您所看到的,当前实现模型和表的方法不允许我这样做。当然,我可以在HotDog和Burger表中添加另一列,但是,如果我需要查询Cooked_by以外的任何内容,则必须在两个表中添加另一列。
最终,我将把“食物”表中的所有列添加到HotDog和Burger中。
这是进行表继承的正确方法吗?我觉得这里不对劲,应该有一个更干净,更好的解决方案。但是,我想尽办法解决这个问题。
最佳答案
一种常见的解决方案。您在热狗和汉堡表中有特定的字段,在食物表中有所有常见的字段。然后,您只需联接表即可获取所有字段。喜欢:
SELECT f.*, h.* FROM food f JOIN hotdog h ON f.id = h.food_id
WHERE f.chief_id = chief0001
得到热狗。