Колоны Kohana (KO3) с объединением ORM - PullRequest
1 голос
/ 05 декабря 2011

Я пытаюсь получить информацию из базы данных, используя Kohana ORM.

В моей базе данных есть две соответствующие таблицы:

филиалы

    id          smallint
    parent_id   smallint
    name        varchar
    active      int

branches_options

    id          mediumint
    branche_id  smallint
    name        varchar
    customer_id int

С помощью следующего кода я хочу получить информацию из таблицы branch_options

`    $branchesOptions[] = ORM::factory('branches_option')
        ->where('branche_id', '=', $subBranche)
        ->join('branches', 'LEFT')->on('branches.id', '=', 'branches_options.branche_id')
        ->order_by('name')
        ->find_all()
        ->as_array();`

Теперь я хочу увидеть значение branch.name в наборе результатов, но я не уверен, как это сделать в Kohana.

Код моделей:

    `class Model_Branche extends ORM
     {
        protected $_has_many = array( 
            "options" => array('model' => 'branches_option'),
            "adwords_templates" => array ('model' => 'adwords_template')
        );

        public $result = array();`

и

    `class Model_Branches_option extends ORM
     {
        protected $_has_many = array ( 
            "keywords" => array('model' => 'branches_options_keyword')
        );

        protected $_has_and_belongs_to = array (
            "adwords_templates" => array (
                "model" => "adwords_template", 
                "through" => "branches_options_templates"
            )
        );

        protected $_belongs_to = array ( "branche" => array () );`

Можно ли это сделать, и если да, то как?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2012

Вам необходимо внести некоторые важные изменения в свои модели, чтобы это работало должным образом:

class Model_Branche extends ORM
{
    protected $_has_many = array( 
        'options' => array(
            'model' => 'branches_option',
            'foreign_key' => 'branche_id'
        )
    );
}

И модель Branches_Option (она должна находиться в папке model/branche/):

class Model_Branches_Option extends ORM
{
    protected $_belongs_to = array(
        'branche' => array()
    );
}

Теперь вы можете сделать что-то подобное:

$options = ORM::factory('branche', $branche_id)
    ->options
    ->find_all();

foreach ($options as $option)
{
    $branche_active = $option->branche->active;
    $branche_name = $option->branch->name;
    $option_name = $option->name;
}

Одним из наиболее важных изменений здесь является то, что мы указываем опцию foreign_key в отношении $_has_many.Поскольку ORM использует помощник Kohana Inflector , он может не распознать его автоматически ( ответвления в единственном числе - ответвление , а не branche ).

Если это не работает, попробуйте указать свойство $_table_name по той же причине.

0 голосов
/ 15 апреля 2013

Я пытаюсь также понять концепцию здесь. Чтобы мыслить как ORM в этом отношении, вам нужно начать с таблиц, на которые основные таблицы ссылаются как на связанную информацию.

Итак, в моем мире у меня есть отчет об отходах (модель / отходы / отчет), и существует еще одна таблица со всеми кодами (модель / отходы / коды). поэтому в таблице waste_reports есть столбец с именем code. Это поле может иметь 2E. 2E ничего не значит без таблицы waste_codes. Таблица waste_codes (идентификатор, код, имя).

Я определил это отношение так:

class Model_Waste_code extends ORM {

    protected $_primary_key = "code";

    protected $_has_one = array(
        'waste_report' => array()
    );
}

Тогда в моей модели отчета об отходах:

class Model_Waste_report extends ORM
{
    protected $_belongs_to = array(
        'codes' => array(
            'model' => 'waste_code',
            'foreign_key' => 'code'
        )
    ); 
}

Чтобы показать разные примеры:

public function action_ormwaste() {
    $test = ORM::factory('waste_report',76);
    if ($test->loaded())
        echo $test->codes->name;

    echo "<hr noshade />";

    $test = ORM::factory('waste_report')->find_all();
    foreach($test as $row)
        echo $row->codes->name . "<BR>";

}

Будет выводить:

Error with image file (mirrored, etc)
-------------------------------------
Wrong Size
Extra Prints
Error with image file (mirrored, etc)
etc...

Так что, по сути, объединение данных обрабатывается на лету. Я использую Kohana 3.2.

Спасибо, это прояснило меня.

...