2012-02-13 4 views
0

У меня есть база данных, как этавнешний ключ в MySQL с использованием Yii

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

==== Costumers === 
id 
firstname 
lastname 

Теперь я сделал отношения между ними моделью так же, как модели this.In Счетов отношения столь же, как это

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 в модель счета-фактуры именно так.

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

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

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

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

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

  • Вы заполняете счета-фактуры (определяется как $model. Я бы изменил его на $invoice, если вам нужно его отредактировать и понять).
  • Вы также публикуете информацию о клиенте, переопределяя значение $valid (так что вы не знаете, действительно ли счет-фактура действителен).
  • Если правомочно (помните, что вы только проверки информации клиента), сделать,
  • Сохранить накладную идентификатор
  • Override клиента с ЗАРУБЕЖНЫМ ключом счета-фактуры к клиенту.
  • Сохраните клиента и перенаправьте его.

Теперь, что я получил от:

  • $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

Спасибо Kor для быстрой reply..but, это не работает – NewUser

+0

могли бы вы показать нам какую-либо ошибку? Вы можете даже публиковать любые ошибки, исходящие из $ invoice-> getErrors() и $ customers-> getErrors() (после проверки() или сохранения()). Кроме того, я отредактировал код, поскольку я забыл изменить 'model' на' invoice' в методе рендеринга. – Korcholis

+0

Я сделал необходимые изменения, которые вы здесь сделали. Но это не работает. Не показывать никаких ошибок. Просто, если внешний ключ не обновляет все данные, они легко сохраняются. – NewUser

0

Пожалуйста, вы должны понять ясный scenerio здесь. почему вы использовали бы if ($ valid) { $ model-> save (false); $ customers-> id = $ model-> customer_id; $ customers-> save (false); $ this-> redirect (array ('view', 'id' => $ model-> id)); }

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

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

ПОМНИТЕ, если вам нужно проверить, если Save() возвращает истину, а затем установить его в $ модели-> сохранить (правда)

Смежные вопросы