首页 > 解决方案 > 如何在 php/mysql 中有效地加载相关对象?

问题描述

情况

我将 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'

返回关联数组后,这将在idname列上产生冲突。

我有两个选择
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对象并将它们分配给$owner我的Pet对象的属性。


投诉

解决方案 1.1(数字索引)

这在技术上是可行的,但是我必须将数字条目映射到正确的属性名称,这似乎很容易出错,尤其是在对 DB 模式进行任何更改时。

解决方案 1.2(前缀)

这很容易工作,但在阅读时,不鼓励在列名前加上前缀。另外......我真的不想给我的列名加上前缀。

解决方案 2

这将起作用,但似乎并不高效。

问题

我还有其他选择吗?

我试图找出一种在SELECT语句中为列名添加前缀的方法(这很好,因为它不会影响实际的数据库),但这似乎是不可能的。

标签: phpmysqlperformancejoindesign-patterns

解决方案


您可以为一个或两个表中的列设置别名,这样它们就不会模棱两可,例如:

SELECT pet.*, person.name AS owner_name
FROM pet JOIN person ON person.id = pet.ownerId
WHERE pet.type LIKE 'cat'

(您不需要从 person 表中选择 id,因为它已经包含在 ownerId 中。)


推荐阅读