我在Yii 2中有两个以下控制器声明。前者在保存后自动获取id,而后者则没有。
这个在$ test-> save()
之后自动获得$ test-> idnamespace 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。数据被写入写入数据库而没有问题。
答案 0 :(得分:2)
我在尝试添加对外表的自动增量字段的引用时遇到了类似的问题。我手动添加了行,然后尝试获取$ record-> id和$ record-> getPrimaryKey(),但即使记录成功提交到数据库后,两者都返回null。
我忽略了这样一个事实,即因为我有一个自动增量字段,我实际上并没有在表上设置主键。 Yii读取数据库模式并使用表信息确定有哪些主键,以及随后如何在插入后更新记录中的主键。因此,即使您的ActiveRecord定义已定义主键,这还不够。一旦我将主键添加到表中,一切都神奇地起作用了!
答案 1 :(得分:1)
尝试使用actionAdd
if ($this->load($customer, $phone, Yii::$app->request->post()) && $customer->save(false ))
和功能商店
$customerRecord->save(false);
可能只是一个验证问题而不是阻止正常进行活动(在这种情况下保存相应的模型)