繁体   English   中英

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

[英]PHP (Phalcon Framework) and MySQL: Models Relationships vs JOIN

例如,有3个表:

  • 产品展示
  • product_images
  • 产品规格

在这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脚本的执行时间?

回答第一个问题:这种做法可能有用,但要取决于您的确切实现。

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

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

只会做一个查询,并为您提供以前想要的相同信息。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM