CakePHP - SQL: объединение таблиц - PullRequest
0 голосов
/ 04 января 2012

У меня есть 4 таблицы:

stores {id, name, owner_id, city_id, ...}
store_managers {id, store_id, user_id, ...}   // since I'm not associating (i have my reasons) the table to the others by cake's association, the name is not by the cakePHP naming conventions. 
cities {id, name, ...}
users {id, name, ...}

Теперь .. в stores_controller есть функция с именем 'stores_stats ()', которая собирает некоторую статистику о магазинах, принадлежащих пользователю, и показывает ее. Owner_id приходит от $this->Auth->user('id')
Я хочу использовать $this->Store->find('all') звонок для получения следующей информации:

  1. Сама запись магазина.
  2. Менеджеры магазинов каждого магазина.
  3. Городской рекорд для каждого магазина.
  4. Сама запись магазина.

Таблицы users и cities связаны с таблицей stores, а запрос find('all') возвращает данные о них правильно. моя проблема с store_managers таблицей.

Как я могу присоединить store_managers к запросу? И просто, чтобы понять это правильно - как я могу написать такой запрос сам? Следующий запрос дает мне кое-что .. еще ..

SELECT *
FROM stores
LEFT JOIN cities ON stores.id = cities.id
LEFT JOIN store_managers ON store_managers.store_id = stores.id
WHERE stores.id = 122 AND stores.owner_id = 3

Ответы [ 2 ]

1 голос
/ 04 января 2012

Возможно, вы захотите использовать сдерживаемое поведение CakePHP. ( подробнее об этом здесь ).

//Store Model
class Store extends AppModel {

var $actsAs = array('Containable');

//associations
//validation

//the method you call from the controller
function getStoreStats() {
    $this->recursive = -1;
    $params = array();
    $params['containable'] = array(
        'User' => array(
             'StoreManager',
        ),
        'City'
    );
    $data = $this->find('all', $params);
    return $data;
}
}

Идея состоит в том, что вы устанавливаете рекурсивное значение на -1, что ограничивает данные, которые вы возвращаете из хранилища, на себя. Затем, используя параметрableable, вы указываете, какие другие связанные данные вы хотите вернуть.

Убедитесь, что вы читаете книгу CakePHP, чтобы убедиться, что вы на правильной версии (1.3, 2.0 ... и т. Д.).

Кроме того, достаточно просто установить $this->recursive=-1; в модели приложения, по умолчанию для всех.

Предполагая, что все ваши отношения установлены правильно, и ни одно из них не является отношением HABTM, Containable должен отлично работать для вас.

0 голосов
/ 04 января 2012

Решение CakePHP для этого было бы реализовать отношение к модели магазинов. Если менеджеров магазинов много, вы можете поместить этот код в модель магазинов:

$hasMany = array(
'StoreManagers' => array( 'className' => 'StoreManagers')
);

Или, если есть только один менеджер магазина:

$hasOne = 'StoreManagers';

Если вы придерживаетесь соглашений об именах, вызов find () должен вернуть массив, где для каждого Store должен быть элемент (или массив) StoreManagers, где будут выбираться все связанные элементы.

Подробнее об объединении таблиц см. здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...