0

たとえば、次の 3 つのテーブルがあります。

  • 製品
  • 商品画像
  • 製品仕様

そして、この 3 つのテーブルのモデルには1 対 1 の関係があります。

ページに 50 個の製品を表示すると、サイクル内で +2 個の余分なクエリが取得されるため、合計で 150 行とクールなオブジェクトがあります。

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

または、Products モデルでカスタム メソッドを作成し、必要なすべてのテーブルを結合します。

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

だから、私は疑問に思っています:最初の練習は役に立ちますか?MySQLデーモンに高い負荷をかけたり、phpスクリプトの実行時間を大幅に遅くしたりしないでください?

4

1 に答える 1

3

あなたの最初の質問への答え: その練習は役に立つかもしれませんが、あなたの正確な実装に依存します.

しかし、あなたは正しいです。組み込みの 1 対 1 の関係を使用すると、関連するモデルが参照されるたびにクエリが実行されるため、負荷が高くなります。そう:

$products->images

各レコードの新しいクエリです。

幸いなことに、PHQL という同じ結果を達成するための、より優れた効率的な方法があります。

1 対 1 は基本的に、2 番目のクエリを介して呼び出される結合されたテーブルであるため (実際には必要ない場合)、次のようにして同じことを行うことができます。

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

これは単一のクエリのみを実行し、以前に必要としていたのと同じ情報を提供します。

これは、コストのかかるクエリを特定し、別の方法を選択する必要がある場合の 1 つにすぎません。

于 2014-01-13T15:51:03.040 に答える