0

我正在尝试插入具有多级 HasMany 关系的模型表中。这是到目前为止的细分

客户->(HasMany)->会员->(HasMany)->收入

但是,在尝试插入收入表时,我得到一个“非空违规”,其中成员表中的外键没有被带到收入表中。我知道最常见的问题是搞砸了 $_has_many 和 $_belongs_to 属性,但据我所知它们很好。另外,只需插入成员表就可以了,所以我至少知道它在第一层工作!我唯一能想到的是,既然它是第二层,它就会因此而搞砸。这是我的代码:

关系链接(会员)

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->incomes(复数)上设置关系,而不是->member->income(单数)。

我也更喜欢单独做关系,而不是像你一样链接它们。因此,如果您在向客户添加新成员或向成员添加新收入时已经设置了关系,我的猜测是索引不会为 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
);

如果您需要更多帮助,您绝对应该展示您如何拥有会员/收入模型和表格。

于 2013-08-28T20:12:37.233 回答