2014-08-29 3 views
0

У меня есть CakePHP-модель «Человек», которая загружает свои данные из mysql-view (public $useTable = 'people_rel';, people_rel - это представление).
Вид соединяет некоторые данные с таблицей «люди».CakePHP: Сохранить модель загружена из MySQL View

Вид prefix_people_rel:

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `xxxxxxx`@`%` 
    SQL SECURITY DEFINER 
VIEW `prefix_people_rel` AS 
    select 
     `prefix_people`.`id` AS `id`, 
     `prefix_people`.`username` AS `username`, 
     `prefix_people`.`first_name` AS `first_name`, 
     `prefix_people`.`last_name` AS `last_name`, 
     `prefix_people`.`email` AS `email`, 
     `prefix_people`.`password` AS `password`, 
     `prefix_people`.`status` AS `status`, 
     `prefix_people`.`outpost_id` AS `outpost_id`, 
     `prefix_outposts`.`region_id` AS `region_id`, 
     `prefix_regions`.`district_id` AS `district_id`, 
     `prefix_districts`.`country_id` AS `country_id` 
    from 
     (((`prefix_people` 
     left join `prefix_outposts` ON ((`prefix_people`.`outpost_id` = `prefix_outposts`.`id`))) 
     left join `prefix_regions` ON ((`prefix_outposts`.`region_id` = `prefix_regions`.`id`))) 
     left join `prefix_districts` ON ((`prefix_regions`.`district_id` = `prefix_districts`.`id`))) 

Таблица prefix_people: The table prefix_people

Колонки region_id, district_id и country_id только для чтения в данной модели, они редактируются в моделях Аутпост, регион и район.
Проблема в том, что я не могу сохранить модель, потому что она загружена из представления.
Я хотел бы загрузить данные из вида people_rel и сохранить их в таблице людей. Как я могу это сделать? (Я использую CakePHP 2.5.3 и хочу обновиться до 3, как только стабильная версия будет доступна)

Большое спасибо!

EDIT:
Это не помогло:
модельное лицо:

public function beforeSave($options = array()) 
{ 
    // ... Password hashing ... 
    $this->useTable = 'people'; 
    return true; 
} 

public function afterSave($created, $options = array()) { 
    $this->useTable = 'people_rel'; 
} 

EDIT 2:
Действительно аналогичное решение работает. См. Ответ ниже.

+1

это не ясно, если вы используете ту же самую модель 'People 'читать и сохранять. Но если это так, попытались ли вы изменить псевдоним таблицы (и таблицу базы данных) в начале 'beforeSave' и изменить его на' people_rel' в конце afterSave? Неужели я не понимаю вашу проблему? – Nunser

+0

Я читаю данные из представления «people_rel» и хочу написать изменения в таблице «люди», но все это делается из модели «Человек». Я попробовал вашу идею с помощью before- and afterSave (см. Мое редактирование), но это не сработало. –

+0

Основываясь на вашей идее, я нашел решение. Я добавлю это ниже. Благодаря! –

ответ

1

Основываясь на идее Nunser, я нашел решение.
В модели, я добавил BeforeSave() и afterSave():

public function beforeSave($options = array()) 
{ 
    //$this->useTable = 'people'; <= Does not work 
    $this->setSource('people'); // Works 
    return true; 
} 

public function afterSave($created, $options = array()) { 
    //$this->useTable = 'people_rel'; <= Does not work 
    $this->setSource('people_rel'); // Works 
} 

необходимо удалять объекты:

public function beforeDelete($cascade = true) { 
    $this->setSource('people'); 
    return true; 
} 

public function afterDelete() { 
    $this->setSource('people_rel'); 
} 
Смежные вопросы