PHP(Phalcon框架)和MySQL:模型关系与连接

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;

例如,有3个表:

  • 产品
  • 产品图片
  • 产品规格
在这三个表的模型中存在一对一的关系

通过在页面上显示50个产品,它可以在循环中获得更多+2个额外查询,因此总共有150行和酷对象:

$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");
它只会执行一次查询,并提供与以前相同的信息

这只是您必须识别昂贵的查询并选择替代方法的其中一种情况