@vegarulez

[ORM] Как соеденить таблицы users и types по has_many?

Привет всем! Подскажите ответ на такой вопрос - читаю везде мануалы по кохане и нигде не могу найти как правильно сделать - везде в примерах только статью, авторы фильмы и прочее. Я уже понял суть формирования model orm под таблицы и связи с другими таблицами. Но нигде не обсуждается как правильно организовать связь, если у меня есть поле в таблице users поле type_id
в котором я делаю сопоставление с таблицей types['id','name'] через таблицу types_users ['user_id', 'type_id'] и связи has_many.
Я создал в папке моделей модель для таблицы types

<?php


defined('SYSPATH') OR die('No direct access allowed.');

class Model_Type extends ORM {
    protected $_table_name = 'types';

    protected $_has_many = array(
        'users' => array('model' => 'User','through' => 'types_users'),
    );

}


И по логике вещей должен ещё создать модель User - и связать со своей - но модель User то уже есть.

Пришлось лезть в папку с modules\orm\classes\model\auth\user\user.php

И там в модели юзера прописывать связь :
protected $_has_many = array(
		'user_tokens' => array('model' => 'User_Token'),
		'roles'       => array('model' => 'Role', 'through' => 'roles_users'),
        'types'       => array('model' => 'Type','through' => 'types_users'),
	);


И впринципе всё завертелось и работает. Но так же нельзя делать, подскажите как мне тогда связать модель юзер и тип, на залазия в папку модулей.

------------------
лирическое отступление - пока писал вопрос в голову пришла мысль
сделать в папке с моделями модель расширующую класс user - и работать уже с помощью нее - что и было сделано - но тут он начал ругаться на то что ключ id он ищет по нзаванию модели + _id - а такого ключа в таблицах нет. Далее привожу код этой модели - подскажите как правильно связать.
-------------------

Пытаюсь сделать через

class Model_Usertype extends Model_User{
    protected $_table_name = 'users';
    protected $_has_many = array(
        'types'       => array('model' => 'Type','through' => 'types_users'),
    );

}
  • Вопрос задан
  • 223 просмотра
Решения вопроса 1
@vegarulez Автор вопроса
А как это повляет на то что он ищет ключ с назавание модели + _id т.е. usertype_id.
Ошибка от этого никуда не ушла.

Database_Exception [ 1054 ]: Unknown column 'types_users.usertype_id' in 'where clause' [ SELECT `type`.`id` AS `id`, `type`.`name` AS `name`, `type`.`timestamp` AS `timestamp`, `type`.`creator` AS `creator`, `type`.`rights` AS `rights`, `type`.`is_active` AS `is_active` FROM `types` AS `type` JOIN `types_users` ON (`types_users`.`type_id` = `type`.`id`) WHERE `types_users`.`usertype_id` = '3' ]


Можно прописать

protected $_primary_key = 'user_id';
но тогда он его уже в таблице юзерс не находит.

Database_Exception [ 1054 ]: Unknown column 'usertype.user_id' in 'where clause' [ SELECT `usertype`.`id` AS `id`, `usertype`.`email` AS `email`, `usertype`.`username` AS `username`, `usertype`.`password` AS `password`, `usertype`.`logins` AS `logins`, `usertype`.`last_login` AS `last_login`, `usertype`.`type` AS `type`, `usertype`.`status` AS `status`, `usertype`.`token` AS `token`, `usertype`.`try_tokens` AS `try_tokens` FROM `users` AS `usertype` WHERE `usertype`.`user_id` = 3 LIMIT 1 ]


----------------------------------
очередное лирическое отступление - уже ответил на впрос - пришлось редактировать - комменты тут нельзя добавлять после ответа
Решение вроде нашел:
has_many как был так и остался - добавил foreign key

<?php

/**
 * Created by PhpStorm.
 * User: alexeyv
 * Date: 31/7/2558
 * Time: 0:15 น.
 */

defined('SYSPATH') OR die('No direct access allowed.');

class Model_Usertype extends Model_User{
    protected $_table_name = 'users';
    protected $_primary_key = 'id';
    protected $_has_many = array(
        'types'       => array('model' => 'Type','through' => 'types_users', 'foreign_key' => 'user_id',),
    );
}


Вроде закрутилось и работает.

Если что есть у вас добавить - прошу написать. а то изучаю кохану всего неделю - полторы и то набегами.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dohlik
@dohlik
Обратите внимание, что весь функционал модели Model_User на самом деле расположен в Model_Auth_User, а в Model_User только наследование. Скопируйте Model_User в application и там добавляйте нужные связи, методы и тд. Одно НО - если Вы добавляете свойство $_has_many в Model_User, то оно перезатрет родительское. Выходов два:

1. Скопировать свойства из Model_Auth_User и добавить еще свое. Это особенность Каскадной Файловой Системы Kohana, почитать можно в официальной доке или тут (или еще где-то в интернете, на русском про основы Коханы уже все давно разжевано).
2. Свойства можно добавлять динамически, посмотрите на метод _initialize(), который вызывается для любой модели ORM. В Вашем случае будет что-то вроде:

protected function _initialize()
{
    // сперва пусть отработают родители
    parent::_initialize();
    $this->_has_many['types'] = array('model' => 'Type','through' => 'types_users');
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы