Как поместить данные из нескольких таблиц в одну модель? - PullRequest
1 голос
/ 11 января 2012

Как сделать модель, которая связывает три таблицы из базы данных? Моя структура БД:

  • Пользователи
    • ID
    • другие поля
  • users_info
    • ID
    • users_id - внешний ключ к таблице 'users'
    • другие поля
  • users_credentials
    • ID
    • users_id - внешний ключ к таблице 'users'
    • другие поля

Раньше я хотел связать 2 таблицы в одной модели, поэтому я использовал метод addRelatedEntity. Вот мой код:

class Model_UserInfo extends Model_Table{
    public $entity_code = 'user_info';
    function init(){
        parent::init();
        $this->addField('phone')->caption('Nr tel');
        $this->addField('users_id');
    }
    function addRelation(){
        $this->addRelatedEntity('i','users','users_id','left outer');
    }

}

и затем расширяю его в другом файле -

class Model_User extends Model_UserInfo{
    function init(){
        parent::init();
        parent::addRelation();

        $this->newField('name')->caption('Imie')->mandatory(true)->relEntity('i','name');
    }

}

И это прекрасно сработало. Но что, если я хочу связать 3 стола в одну модель? Я не могу продлить 2 класса. Есть ли способ использовать addRelatedEntity в Model_User и иметь ссылки на Model_UserInfo и Model_Credentials?

1 Ответ

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

Вам, вероятно, потребуется отменить объединения и начать с таблицы "user", к которой присоединяются 2 другие таблицы, хотя это не имеет большого значения, если вы получаете правильный запрос.

Сначала добавьте$this->debug(); в инициализации вашей модели.Это очень поможет вам, когда вы будете отлаживать соединения, обновления и т. Д.

class Model_User extends Model_Table {
    public $entity_code='users';
    function init(){
        parent::init();
        $this->newField('name')
            ->caption('Imie')
            ->mandatory(true);
    }
}

class Model_User_Combined extends Model_User {
    function init(){
        parent::init();

        $this->addRelatedEntity('info','users_info','inner','related');
        $this->addRelatedEntity('cred','users_credentials','inner','related');

        $this->addField('phone')->caption('Nr tel')->relEntity('info');
        $this->addField('password')->caption('Parol')->relEntity('cred');
    }
}

По сравнению с решением, которое у вас есть сейчас, в качестве основной таблицы используются пользователи и объединяются в дополнительные таблицы как «связанные»..

Также вы получите выгоду от наследования, а Model_User добавит несколько базовых пользовательских полей для вас.

...