我的数据库就像这样
==== Invoices ====
id
customer_id
description
==== Customers ===
id
firstname
lastname
现在我把模型之间的关系做了这样的,在Invoices模型中关系是这样的
public function relations()
{
return array(
'customer' => array(self::BELONGS_TO, 'Customer', 'customer_id')
);
}
在客户模型中,关系是这样的
public function relations()
{
return array(
'invoice' => array(self::HAS_MANY, 'Invoices','customer_id')
);
}
现在定义了关系,一个客户有许多发票,并且发票属于该客户。
现在我创建了多模型,并将Customer模型加载到Invoice模型中,就像这样。
public function actionCreate()
{
$model = new Invoices;
$customers = new Customers;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if (isset($_POST['Invoices'],$_POST['Customers']))
{
$model->attributes = $_POST['Invoices'];
$customers->attributes = $_POST['Customers'];
$valid = $model->validate();
$valid = $customers->validate();
if($valid)
{
$model->save(false);
$customers->id = $model->customer_id;
$customers->save(false);
$this->redirect(array('view','id'=>$model->id));
}
}
$this->render('create',array(
'model'=>$model,
'customers'=>$customers,
));
}
这里一切正常。我可以很容易地插入两个模型的数据。但我的问题是,当我从发票多模型插入数据时,外键id没有改变。每次都显示为零。有人能告诉我哪里错了吗?
如有任何帮助和建议,我们将不胜感激。
2条答案
按热度按时间c9x0cxw01#
我的猜测是您用发票的外键覆盖了客户的主键,我并不是说这样做不正确(也许在您的场景中这是有意义的)。
让我来解释一下你在这段代码中做了什么:
$model
。如果您需要进一步编辑和理解它,我会将其更改为$invoice
)。$valid
值(因此,您不知道发票是否实际有效)。现在,我从中得到的是:
$valid
未按预期工作:我会把它改成递增任务。customer_id
,foreing键是整数,因此如果没有在模型中定义,它将变成0或NULL
。NULL
传递给Customer的模型,因此它可能会在验证时警告您,但是,您使用的是save(false)
,这意味着它不会在保存时进行预验证,因此您永远不知道它是否工作。所以,根据这个:
希望这能解决你的问题。
1qczuiv02#
请你先了解一下这里的情况,为什么要用if($valid){ $model-〉保存(false);$客户-〉标识= $模型-〉客户标识;$客户-〉保存(假);$this-〉redirect(数组('view','id'=〉$模型-〉id));}
$模型-〉保存(假);告知model如果此记录不是保存(),则需要设置$customers-〉id = $model-〉customer_id;
这只会返回false,因为我更喜欢调用($customers-〉id = $model-〉customer_id;)在$model-〉保存()之前;
记住,如果你需要检查保存()是否返回true,那么就把它设置为$model-〉save(true)