Проблема с изменением атрибутов модели в контроллере - PullRequest
0 голосов
/ 26 апреля 2010

Сегодня у меня возникла проблема, когда я попытался использовать следующий код для изменения атрибута модели в контроллере

function userlist($trigger = 1)
{
    if($trigger == 1)
    {
        $this->User->useTable = 'betausers'; //'betausers' is completely the same structure as table 'users'
    }
    $users = $this->User->find('all');
    debug($users);
}

И файл модели

class User extends AppModel
{
    var $name = "User";
    //var $useTable = 'betausers';

    function beforeFind()   //only for debug
    {
        debug($this->useTable);
    }
}

Отладочное сообщение в модели показало, что атрибут userTable был изменен на betausers. И он должен был показать все записи в таблице betausers. Однако я все еще получил данные в users, Это меня очень смутило. И я надеюсь, что кто-то покажет мне некоторые направления для решения этой проблемы.

Привет

Ответы [ 2 ]

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

Model::useTable используется только при создании экземпляра модели (см. Документацию API для Model :: __ construct ). Если вы хотите изменить таблицу модели на лету, вы должны использовать Model::setSource:

if ( $trigger == 1 ) {
    $this->User->setSource('betausers');
}
1 голос
/ 26 апреля 2010

Таблица для использования является «фиксированной», когда модель загружается / создается. В это время создается объект соединения с БД, проверяется схема таблицы и происходит много других вещей. Вы можете изменить эту переменную позже, сколько захотите, Cake больше не смотрит на нее после этой точки.

Одна модель должна быть связана с одной таблицей, и эта связь не должна изменяться во время выполнения. Вам нужно будет сделать другую модель BetaUser и динамически изменить модель, которую вы используете. Или переосмыслите схему базы данных, простой флаг, позволяющий отличить бета-пользователей от обычных пользователей в таблице users, может оказаться лучше, чем новая таблица.

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