0

例如有3个表:

  • 产品
  • 产品图片
  • 产品规格

并且这三个表的模型中存在一对一的关系。

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

$products = Products::find();
foreach ($products as $product)
{
    $product->name;
    $product->images->filename;
    $product->specs->volume;
}

或者只是在 Products Model 中创建自定义方法并加入所有必要的表:

$products = Products::getComplete();
foreach ($products as $product)
{
    $product->name;
    $product->imageFile;
    $product->specVolume;
}

所以,我想知道:第一种做法是否有用并且不会对 MySQL 守护进程造成高负载或大幅减慢 php 脚本执行时间?

4

1 回答 1

3

回答您的第一个问题:这种做法可能很有用,但取决于您的具体实施。

但是,你是对的。使用内置的一对一关系将在每次引用时查询相关模型,这是密集的。所以:

$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");

它只会执行一次查询并为您提供之前想要的相同信息。

这只是您必须识别昂贵的查询并选择替代方法的时候之一。

于 2014-01-13T15:51:03.040 回答