Kohana 3 ORM Вопрос об отношениях - PullRequest
2 голосов
/ 09 мая 2011

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

Что у меня есть:

class Model_Company extends ORM
{
    protected $_has_one = array(
        'companystatus' => array('model' => 'companystatus', 'foreign_key' => 'entryid'),
        'companytype' => array('model' => 'companytype', 'foreign_key' => 'entryid')
        ,
    );
}

Статус компании Модель:

<?php defined('SYSPATH') or die('No direct access allowed.');

class Model_CompanyStatus extends ORM
    {
        protected $_table_name = 'datadictionary';
        protected $_primary_key = 'entryid';

        protected $_has_many = array(
            'company' => array('foreign_key' => 'statusid')
            ,
        );
    }

?>

Тип компании Модель:

<?php defined('SYSPATH') or die('No direct access allowed.');

    class Model_CompanyType extends ORM
    {
        protected $_table_name = 'datadictionary';
        protected $_primary_key = 'entryid';

        protected $_has_many = array(
            'company' => array('foreign_key' => 'companytypeid')
            ,
        );
    }

?>

Модели companystatus и companytype отображаются в одну таблицу, которая имеет 2 поля, entryid и entryname. Эта таблица называется «datadictionary» и имеет соответствующие свойства, поэтому мне не нужно использовать «id» в качестве поля id записи.

Теперь я загружаю запись о своей компании так:

$company = ORM::factory('company')
    ->where('id', '=', 1)
    ->where('hasbeendeleted', '=', 0)
    ->find();

Проблема в том, что я ничего не возвращаю для свойств companystatus и companytype для компании, и когда я делаю $ company-> companystatus-> find (), я получаю первую возвращаемую запись, что странно. Чего мне не хватает?

Спасибо !!

: -)

Edit: Для простоты таблица «Компании» имеет следующие поля:

ID (primary key) - auto inc int
CompanyName - varchar(255)
StatusID - int
CompanyTypeID - int
HasBeenDeleted - smallint (0 for false, 1 for true)

Таблица DataDictionary:

EntryID (primary key) - auto inc int
EntryName - nvarchar(255)

Пример записи о компании:

ID: 1
CompanyName: TestCompany
StatusID: 1
CompanyTypeID: 3
HasBeenDeleted: 0

Пример записей DataDictionary:

EntryID: 1
EntryName: Active

EntryID: 2
EntryName: Inactive

EntryID: 3
EntryName: Customer

EntryID: 4
EntryName: Supplier

1 Ответ

0 голосов
/ 09 мая 2011

Здесь есть несколько вещей, которые я бы попытался изменить.

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

В Kohana 3 объявление 'model' => 'companystatus' в *Массив 1008 * является избыточным, если ключ совпадает с именем модели.Вы можете безопасно удалить эту часть.

Но на самом деле все это имеет отношение к вашей проблеме, которая существует где-то между последним вызовом ORM и вашей базой данных.(Я предполагаю, что hasbeendeleted - это столбец в таблице company, а не одна из двух других упомянутых вами таблиц. Дайте мне знать, если это не так.)

Если вывыполняя ->where('id', '=', 1) вместе с ->find(), вы действительно ожидаете вернуть одну запись компании, если она существует в базе данных.Я бы порекомендовал сделать отдельную проверку для hasbeendeleted.

И, говоря о том, что вместо именования этой переменной $companies, она действительно должна быть единственной (например, $company), поскольку она будет содержать только одну запись.

И вы можете упростить ORM::factory('company')->where('id', '=', 1) до простого ORM::factory('company', 1)

Если вы знаете , что наверняка существует компания с идентификатором базы данных, равным 1, тогдакод должен вернуть эту запись:

$myCompany = ORM::factory('company', 1);

Тогда вы можете сделать что-то вроде if ( ! $myCompany->hasbeendeleted) ...

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

...