如何在php/mysql中高效加载相关对象? 形势
我在mysql中使用PHP&PDO,希望查询1个表以及它在另一个表中指向的行 我有一门课,像:如何在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; 公共名称; 公共宠物; } 桌子呢
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
对象,并将它们分配给myPet
对象的$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.*