PHP(Phalcon框架)和MySQL:模型关系与连接
例如,有3个表:PHP(Phalcon框架)和MySQL:模型关系与连接,php,sql,join,phalcon,table-relationships,Php,Sql,Join,Phalcon,Table Relationships,例如,有3个表: 产品 产品图片 产品规格 在这三个表的模型中存在一对一的关系 通过在页面上显示50个产品,它可以在循环中获得更多+2个额外查询,因此总共有150行和酷对象: $products = Products::find(); foreach ($products as $product) { $product->name; $product->images->filename; $product->specs->volume;
- 产品
- 产品图片
- 产品规格
$products = Products::find();
foreach ($products as $product)
{
$product->name;
$product->images->filename;
$product->specs->volume;
}
或者只需在产品模型中创建自定义方法并连接所有必要的表:
$products = Products::getComplete();
foreach ($products as $product)
{
$product->name;
$product->imageFile;
$product->specVolume;
}
所以,我想知道:第一个练习有用吗?不要在MySQL守护进程上增加高负载或大幅降低php脚本执行时间?回答第一个问题:这个练习可能有用,但取决于具体的实现 但是,你是对的。使用内置的一对一关系,每次引用相关模型时都会查询相关模型,这是一种密集的关系。因此:
$products->images
是每个记录的新查询
幸运的是,有一种更好、更有效的方法可以实现相同的结果——PHQL
由于一对一基本上是通过第二个查询调用的联接表(实际上不需要),因此您可以通过执行以下操作来完成相同的任务:
$products =
(new \Phalcon\Mvc\Model)
->getModelsManager()
->executeQuery(
"SELECT products.*, product_images.*, product_specs.* ".
"FROM Products AS products ".
"JOIN ProductImages AS product_images ".
"ON products.id = product_images.product_id ".
"JOIN ProductSpecs AS product_specs ".
"ON products.id = product_specs.product_id");
它只会执行一次查询,并提供与以前相同的信息
这只是您必须确定昂贵查询并选择替代方法的其中一种情况。回答您的第一个问题:这种做法可能有用,但取决于您的具体实现 但是,你是对的。使用内置的一对一关系,每次引用相关模型时都会查询相关模型,这是一种密集的关系。因此:
$products->images
是每个记录的新查询
幸运的是,有一种更好、更有效的方法可以实现相同的结果——PHQL
由于一对一基本上是通过第二个查询调用的联接表(实际上不需要),因此您可以通过执行以下操作来完成相同的任务:
$products =
(new \Phalcon\Mvc\Model)
->getModelsManager()
->executeQuery(
"SELECT products.*, product_images.*, product_specs.* ".
"FROM Products AS products ".
"JOIN ProductImages AS product_images ".
"ON products.id = product_images.product_id ".
"JOIN ProductSpecs AS product_specs ".
"ON products.id = product_specs.product_id");
它只会执行一次查询,并提供与以前相同的信息
这只是您必须确定昂贵查询并选择替代方法的其中一种情况。回答您的第一个问题:这种做法可能有用,但取决于您的具体实现 但是,你是对的。使用内置的一对一关系,每次引用相关模型时都会查询相关模型,这是一种密集的关系。因此:
$products->images
是每个记录的新查询
幸运的是,有一种更好、更有效的方法可以实现相同的结果——PHQL
由于一对一基本上是通过第二个查询调用的联接表(实际上不需要),因此您可以通过执行以下操作来完成相同的任务:
$products =
(new \Phalcon\Mvc\Model)
->getModelsManager()
->executeQuery(
"SELECT products.*, product_images.*, product_specs.* ".
"FROM Products AS products ".
"JOIN ProductImages AS product_images ".
"ON products.id = product_images.product_id ".
"JOIN ProductSpecs AS product_specs ".
"ON products.id = product_specs.product_id");
它只会执行一次查询,并提供与以前相同的信息
这只是您必须确定昂贵查询并选择替代方法的其中一种情况。回答您的第一个问题:这种做法可能有用,但取决于您的具体实现 但是,你是对的。使用内置的一对一关系,每次引用相关模型时都会查询相关模型,这是一种密集的关系。因此:
$products->images
是每个记录的新查询
幸运的是,有一种更好、更有效的方法可以实现相同的结果——PHQL
由于一对一基本上是通过第二个查询调用的联接表(实际上不需要),因此您可以通过执行以下操作来完成相同的任务:
$products =
(new \Phalcon\Mvc\Model)
->getModelsManager()
->executeQuery(
"SELECT products.*, product_images.*, product_specs.* ".
"FROM Products AS products ".
"JOIN ProductImages AS product_images ".
"ON products.id = product_images.product_id ".
"JOIN ProductSpecs AS product_specs ".
"ON products.id = product_specs.product_id");
它只会执行一次查询,并提供与以前相同的信息
这只是您必须识别昂贵的查询并选择替代方法的其中一种情况