CakePHP имеет одну неэффективность? - PullRequest
1 голос
/ 26 апреля 2010

Я просматривал примеры на сайте CakePHP, в частности hasOne, используемый при связывании моделей. http://book.cakephp.org/view/78/Associations-Linking-Models-Together

У меня такой вопрос, использует ли CakePHP два запроса для построения структуры массива данных, возвращаемых в модели, использующей связь hasOne?

Взято из CakePHP: // Пример результатов вызова $ this-> User-> find ().

Array
(
    [User] => Array
        (
            [id] => 121
            [name] => Gwoo the Kungwoo
            [created] => 2007-05-01 10:31:01
        )
    [Profile] => Array
        (
            [id] => 12
            [user_id] => 121
            [skill] => Baking Cakes
            [created] => 2007-05-01 10:31:01
        )
)

Надеюсь, все это имеет смысл.

Ответы [ 2 ]

2 голосов
/ 27 апреля 2010

Model::find использует объединения для извлечения записей модели, связанных с исходной моделью с помощью отношений hasOne и belongsTo. Определенные SQL-запросы выглядят примерно так (с использованием Car belongsTo Driver структуры модели):

SELECT `Car`.`brand`, `Car`.`colour`, `Driver`.`name`, `Driver`.`age`
    FROM `cars` AS `Car`
    LEFT JOIN `drivers` AS `Driver` ON `Car`.`id` = `Driver`.`car_id`
WHERE `Car`.`brand` = 'Aston Martin'

Поля, принадлежащие каждой модели, могут быть разбиты на соответствующие элементы массива по псевдониму таблицы / модели:

  • Car.brand становится $result['Car']['brand']
  • Car.colour становится $result['Car']['colour']
  • Driver.name становится $result['Driver']['name']
  • Driver.age становится $result['Driver']['age']

Требуется только один запрос.

Получение данных для ассоциаций hasMany и hasAndBelongsToMany требует дополнительных запросов, а иногда и многих других.

0 голосов
/ 26 апреля 2010

уверен, что большинство, если не все hasOne и serveTo, выполняются с использованием join. так один запрос. вы всегда можете установить debug в 2 в config.php, чтобы увидеть SQL-запрос

...