0

複数レベルの HasMany 関係を持つモデルのテーブルに挿入しようとしています。ここまでの内訳です

Customer->(HasMany)->Members->(HasMany)->Incomes

ただし、Incomes テーブルに挿入しようとすると、Members テーブルからの外部キーが Incomments に運ばれないという「Not null 違反」が発生します。最も一般的な問題は $_has_many および $_belongs_to プロパティを台無しにすることですが、私が知る限り、それらは問題ないと言えます。さらに、Member テーブルに挿入するだけで問題なく動作するので、少なくとも最初のレイヤーでは動作していることがわかります! 私が考えることができる唯一のことは、それが2番目のレベルダウンであるため、それが原因で台無しになっている場合です. これが私のコードです:

関係リンク (メンバー)

protected static $_has_many = array(
    'incomes' => array(
        'key_from' => 'id',
        'model_to' => 'Model_Income',
        'key_to' => 'member_id',
        'cascade_save' => true,
        'cascade_delete' => true,
    ),
);

関係リンク (収入)

protected static $_belongs_to = array(
    'member' => array(
        'key_from' => 'member_id',
        'model_to' => 'Model_Member',
        'key_to' => 'id',
        'cascade_save' => true,
        'cascade_delete' => true,
    ),
);

コントローラーコード

// code to set up $customer
$customer->members[] = Model_Member::forge();
// set $member_vals here
$customer->members[0]->set($member_vals);
$customer->members[0]->incomes[] = Model_Income::forge();
// set $income_vals here
$customer->members[0]->incomes[0]->set($income_vals);
$customer->save();
4

1 に答える 1

0

最初に頭に浮かぶ問題は、->members と ->income (単数形) ではなく、->members と ->incomes (複数形) にリレーションを設定していることです

また、あなたのように関係を連鎖させるのではなく、別々に関係を築くことを好みます。したがって、新しいメンバーを顧客に追加するとき、または新しい収入をメンバーに追加するときに、すでにリレーションが設定されている場合、インデックスは 0 にはならないと思います。

代わりに次のことを試してみるとどうなりますか。

$member = Model_Member::forge($member_vals);
$income = Model_Income::forge($income_vals);

$member->income[] = $income;
$customer->member[] = $member;

$customer->save();

それは機能しますか?

別の提案:

テーブル/列の命名規則に従っているように見えるので、これだけを試してください。

// Model_Member
protected static $_has_many = array(
    'incomes'
);

// Model_Income
protected static $_belongs_to = array(
    'members' // plural, not singular like you seem to have
);

さらにヘルプが必要な場合は、Member/Income モデルとテーブルがどのように作成されているかを明確に示す必要があります。

于 2013-08-28T20:12:37.233 に答える