gpt4 book ai didi

mysql - 使用 Yii 在 MySQL 中外键

转载 作者:行者123 更新时间:2023-11-29 08:58:34 25 4
gpt4 key购买 nike

我有这样的数据库

==== 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 值(因此,您不知道发票是否真正有效)。
  • 如果有效(请记住您只是验证客户的信息),请执行
  • 保存发票
  • 使用发票的外键覆盖客户的 ID。
  • 保存客户并重定向。

现在,我从中得到了什么:

  • $valid 未按预期工作:我会将其更改为增量分配。
  • 您可能没有传递来自 ajax 表单的 customer_id。外键是整数,因此如果未在模型中定义,它将变为 0 或 NULL
  • 您总是将 id = 0/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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com