如何在php/mysql中高效加载相关对象? 形势

如何在php/mysql中高效加载相关对象? 形势,php,mysql,performance,join,design-patterns,Php,Mysql,Performance,Join,Design Patterns,我在mysql中使用PHP&PDO,希望查询1个表以及它在另一个表中指向的行 我有一门课,像: class宠物{ 公费$id; 公共名称; 公共$类型; 公共财产所有者; } 还有一张桌子 pet id | name | type | owner_id 0 | jim | cat | 87 1 | gale | dog | 50 2 | foxy | cat | 60 您可以看到Pet指的是所有者。这门课是这样的: 班级人员{ 公费$id; 公共名称; 公共宠物; } 桌子呢

我在mysql中使用PHP&PDO,希望查询1个表以及它在另一个表中指向的行

我有一门课,像:

class宠物{
公费$id;
公共名称;
公共$类型;
公共财产所有者;
}
还有一张桌子

pet
id | name | type | owner_id
0  | jim  | cat  | 87
1  | gale | dog  | 50
2  | foxy | cat  | 60
您可以看到
Pet
指的是所有者。这门课是这样的:

班级人员{
公费$id;
公共名称;
公共宠物;
}
桌子呢

person
id | name 
87 | Joshua
50 | Bob
60 | Cynthia
现在,我想得到所有的猫,每个属性集,包括所有者


解决方案1 如果我有如下问题:

从宠物中选择宠物*、人物*
加入人
ON person.id=pet.ownerId
宠物类型,比如“猫”
返回关联数组后,这将在
id
name
列上创建冲突

我有两个选择
1.)使用返回的数字索引映射到
Pet
对象和相关
Person
对象
2.)为表列名添加前缀&使用返回的关联数组实例化对象


解决方案2 或者我可以执行如下查询:

SELECT*FROM pet WHERE pet.type如“cat”
并得到一个关联数组。我可以循环获取所有所有者ID的列表,并执行以下操作:

从person.id所在的人员中选择*(id列表)
然后实例化
Person
对象,并将它们分配给my
Pet
对象的
$owner
属性


抱怨 解决方案1.1(数字索引) 这在技术上是可行的,但是我必须将数字条目映射到正确的属性名,这似乎很容易出错,尤其是在对DB模式进行任何更改时

解决方案1.2(前缀) 这将很容易实现,但在阅读时,不建议在列名前加前缀。也。。。我真的不想给我的列名加前缀

解决方案2 这将起作用,但似乎不起作用

问题: 还有其他我没有的选择吗


我试图找到一种在
SELECT
语句中为列名加前缀的方法(这很好,因为它不会影响实际的数据库),但这似乎是不可能的。列名应该对其实体具有描述性。在这种情况下,Pet.id应该是Pet.Pet_id,依此类推

希望这有帮助


谢谢,

我认为最好的做法是不要在不同的表中使用相同的列名,这应该得到建议。列名应该对其实体具有描述性。在这种情况下,Pet.id应该是Pet.Pet_id,依此类推

希望这有帮助


谢谢,

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

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

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

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

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

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

据我所知,您不能在MySQL中一次更改或前缀所有列名(
person.*as person.
),只能更改其他答案中提到的单个列。既然你也提到过使用PDO,那么考虑其他方法,下面两个方法。 1.3:使用PDO语句

这将询问数据库有关数字列的其他元数据:

$qry=“从person.id=pet.owner\u id上的pet.type(如“cat”)上的pet JOIN person中选择pet.*,person.*;
$stmt=$dbh->prepare($qry);
$stmt->execute();
而($row=$stmt->fetch(PDO::fetch_NUM)){
foreach($key=>$value的行){
$meta=$stmt->getColumnMeta($key);
echo$meta['table']..$meta['name'].:'.$value.PHP_EOL;
}
}
/*输出:
宠物编号:2
宠物名称:狐狸
宠物类型:猫
宠物主人身份证号码:60
个人识别号:60
姓名:鲍勃
..
*/
1.4:使用带有fetch_风格的PDO语句fetch

这将使具有相同名称的字段成为数组。仍然要注意顺序:
selectpet.*,person.*
vs.
selectperson.*,pet.*

$qry=“从person.id=pet.owner\u id上的pet.type(如“cat”)上的pet JOIN person中选择pet.*,person.*;
$stmt=$dbh->prepare($qry);
$stmt->execute();
while($row=$stmt->fetch(PDO::fetch_name)){
echo$row['name'][1].'拥有一个名为'.$row['type'].'的'.'.$row['name'][0].PHP_EOL;
}
/*输出:
鲍勃养了一只名叫狐狸的猫
约书亚有一只名叫吉姆的猫
*/

据我所知,您不能在MySQL中一次更改或前缀所有列名(
person.*As person.*
),只能更改其他答案中提到的单个列。既然你也提到过使用PDO,那么考虑其他方法,下面两个方法。 1.3:使用PDO语句

这将询问数据库有关数字列的其他元数据:

$qry=“从person.id=pet.owner\u id上的pet.type(如“cat”)上的pet JOIN person中选择pet.*,person.*;
$stmt=$dbh->prepare($qry);
$stmt->execute();
而($row=$stmt->fetch(PDO::fetch_NUM)){
foreach($key=>$value的行){
$meta=$stmt->getColumnMeta($key);
echo$meta['table']..$meta['name'].:'.$value.PHP_EOL;
}
}
/*输出:
宠物编号:2
宠物名称:狐狸
宠物类型:猫
宠物主人身份证号码:60
个人识别号:60
姓名:鲍勃
..
*/
1.4:使用带有fetch_风格的PDO语句fetch

这将使具有相同名称的字段成为数组。仍然要注意顺序:
selectpet.*,person.*
vs.
selectperson.*,pet.*

$qry=“从person.id=pet.own上的pet JOIN person中选择pet.*,person.*