在MySQL中使用Yii创建外键

qjp7pelc  于 2023-03-07  发布在  Mysql
关注(0)|答案(2)|浏览(80)

我的数据库就像这样

==== 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没有改变。每次都显示为零。有人能告诉我哪里错了吗?
如有任何帮助和建议,我们将不胜感激。

c9x0cxw0

c9x0cxw01#

我的猜测是您用发票的外键覆盖了客户的主键,我并不是说这样做不正确(也许在您的场景中这是有意义的)。
让我来解释一下你在这段代码中做了什么:

  • 首先,创建两个模型的新示例,发票和客户。Yii理解为"他们希望在数据库中插入新项目"。
  • 然后,检查是否有来自Ajax表单的条目,如果为真,那么,
  • 您填充Invoices(定义为$model。如果您需要进一步编辑和理解它,我会将其更改为$invoice)。
  • 您还填充了客户信息,覆盖了$valid值(因此,您不知道发票是否实际有效)。
  • 如果有效(请记住,您只是在验证客户的信息),请执行以下操作:
  • 保存发票
  • 用发票的foreing键覆盖客户的id。
  • 保存客户并重新定向。

现在,我从中得到的是:

  • $valid未按预期工作:我会把它改成递增任务。
  • 你可能没有传递一个来自ajax表单的customer_id,foreing键是整数,因此如果没有在模型中定义,它将变成0或NULL
  • 您总是将id = 0/NULL传递给Customer的模型,因此它可能会在验证时警告您,但是,您使用的是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,
    ));
  }

希望这能解决你的问题。

1qczuiv0

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)

相关问题