Внешний ключ в MySQL с использованием Yii - PullRequest
0 голосов
/ 13 февраля 2012

У меня есть база данных, как это

==== Invoices ====
id
costumer_id
description

==== Costumers ===
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')
    );
  }

Теперь, когда мое отношение определено, один клиент имеет много счетов, и счет принадлежит клиенту. Теперь я сделал многомодель и загрузил модель Costumer в модель 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,
    ));
  }

Здесь все в порядке. Я могу легко вставить данные для обеих моделей. Но моя проблема заключается в том, что когда я вставляю данные из многомодели Invoice, идентификатор внешнего ключа не меняется. Это показывает ноль каждый раз. Может кто-нибудь сказать мне, где я ошибаюсь. Любая помощь и предложения будут очень полезны.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2012

Я предполагаю, что вы переопределяете первичный ключ клиента с помощью внешнего ключа счета.Я не говорю, что это неверно (возможно, в вашем сценарии это имеет смысл).

Позвольте мне объяснить, что вы делаете в этом коде:

  • Во-первых,Вы создаете новые экземпляры двух моделей: Счета-фактуры и Клиенты.Yii понимает, что «они хотят вставить новые элементы в базу данных».

  • Затем вы проверяете, есть ли элементы из формы ajax.Если это правда, то

  • Вы заполняете счета-фактуры (определяется как $model. Я бы изменил его на $invoice, на случай, если вам потребуется отредактировать и понять его далее).
  • Вы также заполняете информацию о клиенте, переопределяя значение $valid (поэтому вы не знаете, действителен ли счет-фактура).
  • Если он действителен (помните, что вы проверяете только информацию о клиенте), выполните,
  • Сохранение счета
  • Переопределение идентификатора клиента с помощью первичного ключа счета для клиента.
  • Сохранение клиента и перенаправление.

Сейчас,что я получил от этого:

  • $valid не работает должным образом: я бы изменил это на инкрементное назначение.
  • Возможно, вы не передаете customer_idисходя из формы AJAX.Иностранные ключи являются целыми числами, и поэтому, если они не определены в модели, они становятся 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,
    ));
  }

Надеюсь, это решит вашу проблему.

0 голосов
/ 26 сентября 2012

Пожалуйста, вам нужно понять ясный сценарий здесь.почему вы используете if ($ valid) {$ model-> save (false);$ customer-> id = $ model-> customer_id;$ Клиентам-> сохранить (ложь);$ Этом-> перенаправления (массив ( 'вид', 'идентификатор' => $ модели-> ID));}

$ model-> save (false);говорит модели, что если эта запись не является save (), она должна установить $ Customers-> id = $ model-> customer_id;

Это вернет только ложь, потому что.Я предпочитаю, чтобы вы вызывали ($ Customers-> id = $ model-> customer_id;) перед $ model-> save ();

REMEMBER, если вам нужно проверить, возвращает ли Save () значение trueзатем установите для него значение $ model-> save (true)

...