2015-12-20 2 views
2

У меня есть два следующих объявления контроллера в Yii 2. Бывший получает идентификатор автоматически после сохранения, тогда как последний не делает.Yii 2, класс Active Record не получает идентификатор после сохранения

Это один получает $ Тест-> идентификатор автоматически после $ test-> Сохранить()

namespace app\controllers; 

use yii; 
use yii\web\Controller; 
use app\models\test\Test; 

class TestController extends Controller 
{ 
    public function actionAdd() 
    { 
     $model = new Test; 

     if ($model->load(Yii::$app->request->post()) && $model->save()) 
     { 
      var_dump($model); 
      return 'success'; 
     } else { 
      return $this->render('add', [ 
       'model' => $model, 
      ]); 
     } 

    } 
} 

Где это один не

namespace app\controllers; 

use Yii; 
use yii\web\Controller; 
use app\models\customer\Customer; 
use app\models\customer\Phone; 
use app\models\customer\CustomerRecord; 
use app\models\customer\PhoneRecord; 

class CustomersController extends Controller 
{ 
    private function store (Customer $customer) 
    { 
     $customerRecord = new CustomerRecord(); 
     $customerRecord->name = $customer->name; 
     $customerRecord->birthDate = $customer->birthDate->format('dd-mm-yyyy'); 
     $customerRecord->notes = $customer->notes; 

     echo 'customer before save'; 
     var_dump($customerRecord); 
     $customerRecord->save(); 
     echo 'customer after save'; 
     var_dump($customerRecord); 


     foreach ($customer->phones as $phone) 
     { 
      $phoneRecord = new PhoneRecord(); 
      $phoneRecord->number = $phone->number; 
      $phoneRecord->customer_id = $customerRecord->id;   
      $phoneRecord->save(); 
     } 

    } 

    private function makeCustomer(CustomerRecord $customerRecord, 
      PhoneRecord $phoneRecord) 
    { 
     $name = $customerRecord->name; 
     $birthDate = new \DateTime($customerRecord->birthDate); 
     $customer = new Customer ($name, $birthDate); 
     $customer->notes = $customerRecord->notes; 
     $customer->phones[] = new Phone($phoneRecord->number); 

     return $customer; 

    } 

    public function actionAdd() 
    { 
     $customer = new CustomerRecord; 
     $phone = new PhoneRecord; 

     if ($this->load($customer, $phone, Yii::$app->request->post()) && $customer->save()) 
     { 
      $this->store($this->makeCustomer($customer, $phone)); 
     } 

     return $this->render('add', ['customer' => $customer, 'phone' => $phone]); 
    } 

    private function load (CustomerRecord $customerRecord, Phonerecord $phoneRecord, 
      array $post)    
    { 
     return $customerRecord->load(Yii::$app->request->post()) 
       and $phoneRecord->load(Yii::$app->request->post()) 
       and $customerRecord->validate() 
       and $phoneRecord->validate(['number']); 
    } 


} 

последних кода из книги с именем «Web Разработка приложений с Yii 2 и PHP », и он использует переходный уровень между MVC и активной записью (если я правильно понимаю).

$ customerRecord-> update() и $ customerRecord-> getPrimaryKey() также не помогает.

Любые идеи?

P.S. данные записываются на запись в db без проблем.

+0

Имеет ли таблица первичный ключ? Включен ли auto_increment для первичного ключа? – Dador

+0

Да и да. И они работают так, как ожидалось. – SercioSoydanov

ответ

1

попытка использования в actionAdd

if ($this->load($customer, $phone, Yii::$app->request->post()) && $customer->save(false)) 

и функции магазина

$customerRecord->save(false); 

может быть только проблема проверки, чем препятствует надлежащему проведению мероприятий, (в этом случае сохранение соответствующей модели)

+0

Спасибо, это сработало как шарм. Большое спасибо :) Но возникли новые вопросы :) - этот ложный параметр отключает проверку. Это верно? - Если это так, это означает, что проверка не удалась ранее (или делает это?). Но это не мешало записывать модель в базу данных. Это ожидаемое поведение? Если это так, что делает валидация? - Как я могу получить результат проверки, чтобы узнать, что не так? – SercioSoydanov

+1

Да проверка фальшивых отключений. Это не для производства, а только для тестовой среды. В этом случае проверка достоверно завершилась неудачей. Вы должны выборочно (комментировать) оценивать правило в отличие от необходимости и коррекции правила или логики вашего приложения. – scaisEdge

+0

Выяснил это. Это была проблема форматирования даты. Теперь он работает и без ложных параметров. Большое спасибо :) – SercioSoydanov

1

У меня была аналогичная проблема при попытке добавить ссылку на поле auto-increment внешней таблицы. Я вручную добавлял строку, а затем пытался получить $ record-> id и $ record-> getPrimaryKey(), но оба возвращались null даже после того, как запись была успешно передана в базу данных.

Я упустил из виду тот факт, что только потому, что у меня было поле с автоматическим приращением, у меня на самом деле не было первичного ключа, установленного на столе. Yii читает схему базы данных и использует информацию таблицы, чтобы определить, какие первичные ключи есть, а затем как обновить первичные ключи в вашей записи после вставки. Поэтому, даже если определение ActiveRecord определило первичный ключ, этого недостаточно. Как только я добавила первичный ключ к таблице, все волшебство сработало!

+0

Спасибо, я буду помнить об этом. – SercioSoydanov

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