В CAKEPHP мы можем динамически изменить таблицу, связанную с конкретной моделью? - PullRequest
6 голосов
/ 13 января 2011

Предположим, у меня есть 2 идентичные таблицы, имеющие одинаковую структуру (назовите это 'tableA' & 'tableB').

Я хочу сохранить определенные данные в таблице 'A' и определенные данные в таблице 'B'.

СЕЙЧАС Я хочу использовать одну и ту же МОДЕЛЬ для обеих таблиц.

Я хочу изменить таблицу, связанную с моделью (скажем, «ModelM»), чтобы она динамически изменялась в зависимости от состояния на контроллере.

например,


В контроллере: - // пример кода

function saveProduct(){

    $this->loadModel('ModelM');

    if(condition){

        $this->ModelM->useTable = 'A';

    }else{

        $this->ModelM->useTable = 'B';

     }
     $this->ModelM->save($this->data);

}

ДОПОЛНЕНИЕ НА 14 ЯНВАРЯ 2011 ГОДА

Ниже приведена копия / вставка кода, над которым я работаю:

function experiment(){

    $tableName = 'temp_table'.'1234';

    mysql_query('CREATE TABLE '.$tableName.' LIKE temp_home_masters');

    $sql = $this->createInsertQuery($new_arr,$tableName);

    $status = mysql_query($sql);

    if($status){
        echo "saved successfully";
    }else{
        echo "error";
    }

    $this->NewHomeMaster->setSource($tableName);//NewHomeMaster was previously attached to a different table , here I want to change the tableName the model linked with dynamically.Model 'NewHomeMaster' already exists and uses a table ...Here I am willing to link this model to the newly created tempory table.//

    $home_details=$this->paginate('NewHomeMaster',array($new_conditions));

    mysql_query('DROP table '.$tableName);

}

К сожалению, это не работает ...

Ответы [ 3 ]

3 голосов
/ 13 января 2011

Я изначально намеревался найти решение вашей проблемы, но чем больше я об этом думаю, тем больше у вас логика.

Я вижу, как тот факт, что таблицы похожи или идентичны, может привести к решению использовать одну модель для взаимодействия с обеими таблицами. Однако, когда вы смотрите на то, какой должна быть модель (в CakePHP, в основном, это интерфейс с таблицей), нет смысла переключаться туда и обратно.

Документы CakePHP объясняют такие модели:

В объектно-ориентированном программировании модель данных - это объект, представляющий «вещь», например автомобиль, человека или дом.

В вашем примере у вас действительно есть две отдельные "вещи", которые выглядят абсолютно одинаково. Поэтому у них должны быть свои модели.

Если ваши модели действительно будут иметь точно такие же методы, то "Путь CakePHP" будет определять пользовательское Поведение , которое инкапсулирует ваши общие методы. Затем прикрепите поведение к обеим моделям.

Затем вы можете загрузить нужную модель в состоянии контроллера:

private $DynamicModel;

public function saveProduct() {
    if (condition) {
        App::import('Model', 'ModelZ');
        $this->DynamicModel = new ModelZ;
    } else {
        App::import('Model', 'ModelY');
        $this->DynamicModel = new ModelY;
    }
    $this->DynamicModel->save($this->data);
}
1 голос
/ 13 января 2015

Сделайте это на своих контроллерах перед функцией фильтра:

$ this-> CakePHPModelName-> setSource ( 'table_name');

Это будет использовать другую таблицу.

Источник: http://www.mainelydesign.com/blog/view/changing-cakephps-model-usetable-on-fly

0 голосов
/ 13 января 2011

Ситуация сложная, как описывает ее Стивен, потому что ваш подход несколько нарушает соглашения MVC.

Однако, если вы хотите перейти на темную сторону пользовательских хаков, вы можете рассмотреть возможность создания собственного настраиваемого источника данных в CakePHP, который обрабатывает такую ​​логику для вас.Одним из вариантов является расширение заданного источника данных (предположительно MySQL) с помощью собственной пользовательской логики, цель которой - выполнить некоторую предварительную фильтрацию / согласование перед взаимодействием с базой данных.Не так чисто, потому что логика находится в неправильной области видимости, но может работать.Посмотрите здесь для начала: http://book.cakephp.org/view/1075/DataSources

В качестве альтернативы, вы можете создать две разные модели и заставить их использовать одну и ту же логику, используя поведение.Это как бы ограничивает вас в выборе модели на более ранней стадии (и, следовательно, влияет не только на место хранения данных), но и может быть возможным.

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