【发布时间】:2019-11-25 16:28:14
【问题描述】:
情况
我将 PHP 和 PDO 与 mysql 一起使用,并想查询 1 个表以及它在另一个表中指向的行。
我有这样的课:
class Pet {
public $id;
public $name;
public $type;
public $owner;
}
还有一张桌子
pet
id | name | type | owner_id
0 | jim | cat | 87
1 | gale | dog | 50
2 | foxy | cat | 60
您可以看到Pet 指的是所有者。这个类是这样的:
class Person {
public $id;
public $name;
public $pets;
}
还有桌子
person
id | name
87 | Joshua
50 | Bob
60 | Cynthia
现在,我想获取所有猫,每个属性集,包括主人。
解决方案 1
如果我有这样的查询:
SELECT pet.*, person.* FROM pet
JOIN person
ON person.id = pet.ownerId
WHERE pet.type LIKE 'cat'
返回关联数组后,这将在id 和name 列上产生冲突。
我有两个选择
1.) 使用返回的数字索引映射到 Pet 对象和相关的 Person 对象
2.) 为表列名添加前缀并使用返回的关联数组来实例化对象
解决方案 2
或者我可以进行如下查询:
SELECT * FROM pet WHERE pet.type LIKE 'cat'
并得到一个结果关联数组。我可以遍历并获取所有所有者 ID 的列表并执行以下操作:
SELECT * FROM person WHERE person.id IN (LIST_OF_IDS)
然后实例化Person 对象并将它们分配给我的Pet 对象的$owner 属性。
投诉
解决方案 1.1(数字索引)
这在技术上是可行的,但是我必须将数字条目映射到正确的属性名称,这似乎很容易出错,尤其是对数据库架构进行任何更改时。
解决方案 1.2(前缀)
这将很容易工作,但在阅读时,不鼓励在列名前加上前缀。另外...我真的不想在列名前加上前缀。
解决方案 2
这可行,但似乎性能不佳。
问题
我还缺少其他选项吗?
我尝试想办法在SELECT 语句中为列名添加前缀(这很好,因为它不会影响实际的数据库),但似乎不可能。
【问题讨论】:
标签: php mysql performance join design-patterns