2015-02-16 3 views
0

Kohana ORM имеет следующие соотношения между моделью:Kohana ORM - добавить новую запись для has_many, HAS_ONE отношения

  1. HAS_ONE
  2. has_many
  3. has_many_through

К примеру, у меня есть определенных ниже:

class Model_ORM_Text extends ORM { 

    protected $_has_one = array(
     'compiledData' => array('model' => 'CompiledText', 'foreign_key' => 'idText'), 
    ); 

    protected $_has_many = array(
     'translations' => array('model' => 'TextTranslation', 'foreign_key' => 'idText') 
    ); 

    protected $_has_many_through = array(
     'tags' => array('model' => 'TextTranslation', 'through' => 'rl_text_tags') 
    ); 
} 

Мне нужно создать новую связанную модель для каждого из этих отношений. Я только нашел add метод в ORM классе, который позволяет добавлять соответствующую модель, которая связана через has_many_through отношений, как это:

$text->add("tags", $tagId); 

Но я не могу найти где-нибудь, как я могу добавить связанную модель для has_one и простые отношения has_many. Является ли это возможным?

+0

Просто установите их. '$ text-> compiledData = $ compiledData; $ text-> save(); ' – kero

+0

Спасибо, вы можете сделать это ответом? Будет ли это работать как для отношений 'has_one', так и' has_many'? –

ответ

1

Ключ на вопрос, что на «другой» стороне каждого has_many и has_one есть belongs_to. И это модель, где информация сохраняется.

В вашем случае Model_CompiledText имеет столбец idText (под конкретным псевдонимом). Чтобы (un) установить отношение, вам нужно манипулировать этим полем. Скажем, у вас есть belongs_to там под названием text, это то, как вы могли бы сделать это:

$compiledText = ORM::factory('CompiledText'); 

// set text 
// Version 1 
$compiledText->text = ORM::factory('Text', $specificId); 
// Version 2 
$compiledText->text = ORM::factory('Text')->where('specificColumn', '=', 'specificValue') 
    ->find(); 

// unset text 
$compiledText->text = null 

// save 
$compiledText->save(); 

В случае has_one вы можете получить к нему доступ непосредственно через родителя и так делают

$text->compiledData->text = ...; 
+0

Спасибо, царькеро! Так что вы говорите, что для отношений 'has_one' и' has_many' я должен использовать модель, которая определена как 'belongs_to' и не может создать связанную модель из модели, которая имеет отношение' has_one' \ ' has_many'? Как насчет этого решения, которое вы упомянули '$ text-> compiledData = $ compiledData; $ Text-> Save(); '? вместо '$ compiledText-> text = ORM :: factory ('Text', $ specificId)'? –

+1

@Maximus Да, это выглядит так. Я подумал, что для 'has_one' он может быть установлен в этой модели, но он не выглядит таким образом (возможно, можно отменить, но не так легко установить, если он еще не был). Похоже, вам нужно сделать '$ compiledText-> text = $ text; $ CompiledText-> Save(); $ text-> reload(); ' – kero

+0

Понравилось, спасибо! –