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. данные записываются в записанную в бд без проблем.
2 answers
Попробуйте использовать в actionAdd
if ($this->load($customer, $phone, Yii::$app->request->post()) && $customer->save(false ))
И хранилище функций
$customerRecord->save(false);
Может быть только проблемой проверки, чем это препятствует надлежащему проведению мероприятий (в данном случае сохранению соответствующей модели)
У меня была аналогичная проблема при попытке добавить ссылку на поле автоматического увеличения внешней таблицы. Я вручную добавлял строку, а затем попытался получить $record->id и $record->getprimarykey(), но оба возвращали значение null даже после того, как запись была успешно зафиксирована в базе данных.
Я упустил из виду тот факт, что только потому, что у меня было поле автоматического увеличения, у меня на самом деле не было первичного ключа, установленного на столе. Yii считывает схему базы данных и использует таблицу информация для определения имеющихся первичных ключей и последующего способа обновления первичных ключей в вашей записи после вставки. Поэтому, даже если в вашем определении ActiveRecord определен первичный ключ, этого недостаточно. Как только я добавил первичный ключ в таблицу, все волшебным образом сработало!