php - 如何在 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'
返回关联数组后,这将在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
对象并将它们分配给$owner
我的Pet
对象的属性。
投诉
解决方案 1.1(数字索引)
这在技术上是可行的,但是我必须将数字条目映射到正确的属性名称,这似乎很容易出错,尤其是在对 DB 模式进行任何更改时。
解决方案 1.2(前缀)
这很容易工作,但在阅读时,不鼓励在列名前加上前缀。另外......我真的不想给我的列名加上前缀。
解决方案 2
这将起作用,但似乎并不高效。
问题
我还有其他选择吗?
我试图找出一种在SELECT
语句中为列名添加前缀的方法(这很好,因为它不会影响实际的数据库),但这似乎是不可能的。
解决方案
您可以为一个或两个表中的列设置别名,这样它们就不会模棱两可,例如:
SELECT pet.*, person.name AS owner_name
FROM pet JOIN person ON person.id = pet.ownerId
WHERE pet.type LIKE 'cat'
(您不需要从 person 表中选择 id,因为它已经包含在 ownerId 中。)
推荐阅读
- python - 通过输出解析
- javascript - 有没有办法将 angular 与现有的 php/js/html web 项目结合起来?
- node.js - 响应发送的请求后立即从节点更新 Amazon DDB 表
- android-studio - 我在使用 Android Studio 时遇到问题,无法像其他项目一样制作项目
- php - 数组匹配计数比预期少一
- excel - 如何修复由 Target.Formula 函数引起的“运行时错误'1004'”
- java - 为什么tomcat(64bit)在windows server上不能访问超过4.5g的内存?
- python - 带有中心裁剪的 Keras ImageDataGenerator 用于旋转和平移移位
- node.js - 如何在 nodejs 应用程序中连接到 mongoDs-Atlas?
- react-redux - 如何在渲染时引用其他组件的状态时测试目标组件