Yii 2,Active Record类在保存后没有获取ID

时间:2015-12-20 11:50:53

标签: php activerecord model controller yii2

我在Yii 2中有两个以下控制器声明。前者在保存后自动获取id,而后者则没有。

这个在$ test-> save()

之后自动获得$ test-> id
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。数据被写入写入数据库而没有问题。

2 个答案:

答案 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);

可能只是一个验证问题而不是阻止正常进行活动(在这种情况下保存相应的模型)