下記のように categories、items というテーブルがあるとします。
categoriesテーブルは、items.category_idをキーとしてアソシエーションしています。
sql
1CREATE TABLE `categories` ( 2 `id` smallint(6) NOT NULL AUTO_INCREMENT, 3 `name` varchar(100) NOT NULL, 4 `created` datetime NOT NULL, 5 `modified` datetime NOT NULL, 6 PRIMARY KEY (`id`) 7) ENGINE=InnoDB DEFAULT CHARSET=utf8 8
sql
1CREATE TABLE `items` ( 2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 3 `category_id` smallint(6) NOT NULL DEFAULT '1', 4 `item_name` varchar(100) NOT NULL, 5 `body` text DEFAULT NULL, 6 `created` datetime NOT NULL, 7 `modified` datetime NOT NULL, 8 `deleted` tinyint(4) NOT NULL DEFAULT '0', 9 PRIMARY KEY (`id`) 10) ENGINE=InnoDB DEFAULT CHARSET=utf8
これに対して、ItemsController.php 内のアクションで Categoriesテーブルのレコードを取得しようとしています。
その時、アソシエーションの処理を利用して取得する場合は、下記のようになると思います。
php
1// Categoriesテーブルの読み込み 2$categoriesList = $this->Products->Categories->find("treeList")->where(["Categories.deleted"=>0])->all()->toArray(); 3$this->set(compact("categoriesList")); 4
アソシエーションは関係なしに取得する場合は、下記のようになるかと思います。
php
1// Categoriesテーブルの読み込み 2$this->Categories = TableRegistry::getTableLocator()->get("categories"); 3$categoriesList = $this->Categories->find("treeList")->where(["deleted"=>0])->all()->toArray(); 4$this->set(compact("categoriesList"));
Bakeすると、前者の方で生成されますので、望ましい記述の方法なのだろうと思います。
ですが、レコード数が多くなってきた場合などを考えると、処理が重たくなることはないのだろうか、と気になりました。
後者の方はアソシエーションに関係なく Categoriesテーブルを直接取得しますので、Itemsテーブルのレコード数に関係なく処理が重くなることはないのではないのか、とも思いました。
Itemsのレコードが多くなっても処理が重くなりにくい記述方法はどちらでしょうか?
どちらでも違いはないものなのでしょうか?
回答1件
あなたの回答
tips
プレビュー