Использование $ _has_many в модели ORM Коханы - PullRequest
0 голосов
/ 13 мая 2011

Итак, я пытаюсь изучить 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();
    }

}

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

РЕДАКТИРОВАТЬ: После перечитывания, это может быть не очень ясно.То, что я пытаюсь сделать, это обновить объект $ recipe, а затем обновить / добавить ингредиенты и их один-к-одному подобъекты (элементы), например, так:

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

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

Еще одна вещь, которую вы упускаете - заполнение имеет много связей с данными; нет смысла делать это так, как вы пытаетесь, а:

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, которые должны быть выполнены для получения ошибок проверки.

3 голосов
/ 13 мая 2011

Для $ _has_many вы должны использовать множественное число.

Вместо:

protected $_has_many = array( 'ingredient' => array() );

попробовать:

protected $_has_many = array( 'ingredients' => array() );

...