作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这样的数据库
==== Invoices ====
id
customer_id
description
==== Customers ===
id
firstname
lastname
现在我已经像这样建立了模型之间的关系。在发票模型中,关系如下
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')
);
}
现在,根据我的关系定义,一个客户拥有多张发票,并且发票属于该客户。
现在我制作了多模型并将客户模型加载到发票模型中,就像这样。
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 没有改变。每次都显示为零。谁能告诉我我哪里错了。
任何帮助和建议将不胜感激。
最佳答案
我的猜测是您正在使用发票的外键覆盖客户的主键。我并不是说这样不正确(也许在您的情况下这是有意义的)。
让我解释一下您在该代码中所做的事情:
首先,您创建两个模型的新实例:发票和客户。 Yii 将其理解为“他们希望在数据库中插入新项目”。
然后,检查是否有来自 ajax 表单的项目。如果属实,那么,
$model
。我会将其更改为 $invoice
,以防您需要进一步编辑和理解)。$valid
值(因此,您不知道发票是否真正有效)。现在,我从中得到了什么:
$valid
未按预期工作:我会将其更改为增量分配。customer_id
。外键是整数,因此如果未在模型中定义,它将变为 0 或 NULL
。NULL
传递给客户的模型,因此它可能会在验证时向您发出警告。但是,您使用的是 save(false)
,这意味着它不会在保存时进行预先验证,因此您永远不知道它不起作用。所以,根据这个:
public function actionCreate()
{
$invoice = new Invoices;
$customers = new Customers;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($invoice);
if (isset($_POST['Invoices'],$_POST['Customers']))
{
$invoice->attributes = $_POST['Invoices'];
$customers->attributes = $_POST['Customers'];
$valid = true; /* expect it is always valid */
$valid &= $invoice->validate(); /* if $invoice is not valid, $valid will be false (true&false = false) */
$valid &= $customers->validate(); /* same as the above line */
if($valid)
{
$customers->save(); /* First save customers. It's the Foreign item */
$invoice->customer_id = $customers->getPrimaryKey(); /* new instances use getPrimaryKey() to get its id */
$invoice->save(); /* Save invoice AFTER getting customer's primary key */
$this->redirect(array('view','id'=>$invoice->id));
}
}
$this->render('create',array(
'invoice'=>$invoice,
'customers'=>$customers,
));
}
希望这能解决您的问题。
关于mysql - 使用 Yii 在 MySQL 中外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9264356/
我是一名优秀的程序员,十分优秀!