2014-01-13 5 views
0

가입 3 개 테이블이 있습니다 :PHP (Phalcon 프레임 워크)와 MySQL : 모델 관계 대 예를 들어

  • 제품
  • product_images
  • product_specs

는 그리고 한에있다 이 3 개의 테이블의 모델에서 관계.

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

하거나 제품 모델에서 사용자 지정 메서드를 작성하고 모든 가입 : 150 행과 차가운 물체가 총 그래서,주기 내에서 더이 추가 쿼리를 얻을 - 페이지 50 개의 제품을 보여

필요한 테이블 : 그래서

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

, 내가 궁금하네요 : 1 연습 유용하고 MySQL의 데몬에 높은 부하를하거나 크게 PHP 스크립트 실행 시간을 느리게하지?

답변

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"); 
: 일대일 기본적으로 (정말 필요하지 않습니다) 두 번째 쿼리를 통해 호출되는 조인 된 테이블, 당신은 같은 것을 수행하여 같은 일을 수행 할 수 있기 때문에

단일 쿼리 만 수행하고 이전과 동일한 정보를 제공합니다.

이것은 비싼 쿼리를 식별하고 다른 방법을 선택해야하는 시대 중 하나입니다.