【问题标题】:PHP (Phalcon Framework) and MySQL: Models Relationships vs JOINPHP(Phalcon 框架)和 MySQL:模型关系与 JOIN
【发布时间】:2014-02-01 03:19:19
【问题描述】:

例如有3个表:

  • 产品
  • product_images
  • 产品规格

这三个表的模型之间存在一对一关系。

通过在页面上显示 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 脚本执行时间?

【问题讨论】:

    标签: php sql join phalcon table-relationships


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 2013-04-03
      • 2018-05-27
      • 1970-01-01
      相关资源
      最近更新 更多