所以我正在努力学习Kohana,当谈到他们的ORM模块时,我遇到了很多麻烦。 尝试设置一对多ORM对象时,我可以更新/插入来自父模型的信息,但不允许我关联(插入/更新)任何新子项。< /强>
为清楚起见,这是我的数据库结构......
recipes
--id
--recipe
--directions
--servings
ingredients
--id
--recipe_id
--amount
--serving
items
--id
--item
......我的模特......
class Model_Recipe extends ORM
{
protected $_has_many = array( 'ingredient' => array() );
}
class Model_Ingredient extends ORM
{
protected $_belongs_to = array( 'recipe' => array() );
protected $_has_one = array( 'item' => array() );
}
class Model_Item extends ORM
{
protected $_belongs_to = array( 'ingredient' => array() );
}
...和我的控制器......
class Controller_Recipe extends Controller
{
function action_save_form()
{
$recipe = ORM::factory( 'recipe', 1 );
$recipe->ingredient->recipe_id = 1;
$recipe->ingredient->amount = 1;
$recipe->ingredient->measurement_type = 'tablespoon';
$recipe->ingredient->save();
$recipe->ingredient->item->item = 'butter';
$recipe->ingredient->item->ingredient_id = $recipe->ingredient->id;
$recipe->ingredient->item->save();
}
}
我坦率地承认这是由于我的无能,但我已经通过源代码浏览了docs / wiki / read(ing),并且无法找到任何接近的内容。感谢每个人都有的帮助/想法
编辑:重新阅读后,可能不太清楚。我想要做的是更新$ recipe对象,然后更新/添加成分,以及它们的一对一子对象(项目),如下所示:答案 0 :(得分:3)
对于$ _has_many,你应该复数。
而不是:
protected $_has_many = array( 'ingredient' => array() );
尝试:
protected $_has_many = array( 'ingredients' => array() );
答案 1 :(得分:3)
正如奥斯丁指出的那样,许多关系应该按惯例复数。
你缺少的另一件事是填充与数据有很多关系;按照你尝试的方式进行操作是没有意义的,而是:
function action_save_form()
{
$recipe = ORM::factory('recipe', 1);
// Create an ingredient and attach it to the recipe (one-to-many)
$ingredient = ORM::factory('ingredient')->values(array(
'amount' => 1,
'measurement_type' => 'tablespoon',
'recipe' => $recipe, // sets the fk
));
$ingredient->create();
// Update all ingredients?
foreach ($recipe->ingredients->find_all() as $ingredient)
{
$ingredient->amount = 2;
$ingredient->update();
}
// Create an item and attach to the recipe (one-to-one)
$item = ORM::factory('item')->values(array(
'item' => 'butter',
'ingredient' => $ingredient,
));
$item->create();
// Update the recipes' item after it's been created
$ingredient->item->item = 'chocolate';
$ingredient->item->update();
}
注意:此示例未捕获ORM_Validation_Exceptions,应执行此操作以获取验证错误。