Yii 2, класс активной записи не получает идентификатор после сохранения


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

Этот получает идентификатор $test->автоматически после $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']);
    }


}

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

$customerrecord->обновить() и $custOmerrecOrd->getprimarykey() также не помогает.

Есть идеи?

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

Author: SercioSoydanov, 2015-12-20

2 answers

Попробуйте использовать в actionAdd

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

И хранилище функций

 $customerRecord->save(false);

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

 1
Author: scaisEdge, 2015-12-20 12:35:15

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

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

 2
Author: Simple Guy, 2016-12-02 08:01:09