新创建的Eloquent对象不会在单独的创建Eloquent调用中返回属性

时间:2015-11-24 10:47:11

标签: php laravel eloquent

下面的代码显示了我的Eloquent Link课程中的方法。创建新Link后,我想创建一个相关对象LinkContact,然后使用新Link创建associate()

创建LinkContact时,我在访问Link的id属性时遇到了问题。仅当为新相关对象(Link)执行create方法时,LinkContact id值才会显示无法访问。

在调用create方法之前使用Laravel Debugbar一行我记录了Link id,我可以看到它就好了!任何想法为什么会发生这种情况以及为什么我无法获取价值?!是否与范围有关?

请注意评论的位置

public function createActiveLink($students)
{
    $links = [];

    foreach ($students as $student) {
        $newLink = $this->create([
            'token'          => $student->saudi_nid,
            'status'         => 'active',
            'course_title'   => $student->course_title,
            'university_id'  => $student->university_id,
            'student_id'     => $student->id,
            'institution_id' => $student->institution_id,
            'course_id'      => $student->course_id,
        ]);

        $studentContacts = $student->institutionContacts;

        if ($studentContacts) {

            foreach ($studentContacts as $studentContact) {
                /* I get the value here, no problems */
                \Debugbar::info($newLink->id);

                $linkContact = $this->contacts()->create([
                    'type'                   => $studentContact->pivot->type,
                    'institution_contact_id' => $studentContact->pivot->institution_contact_id,
                    /* $newLink->id returns nothing here */
                    'link_id'                => $newLink->id, here!!
                ]);

                $newLink->contacts()->associate($linkContact);

                $newLink->save();
            }

        }

        $links[] = $newLink;
    }

    return $links;
}

尝试上述代码时收到的错误:

SQLSTATE[23000]: Integrity constraint violation: 1048 
Column 'link_id' cannot be null 
(SQL: insert into `link_contacts` 
    (`type`, `institution_contact_id`, `link_id`, `updated_at`, `created_at`) 
     values (1, 1, , 2015-11-24 10:26:32, 2015-11-24 10:26:32))
C:\...\vendor\laravel\framework\src\Illuminate\Database\Connection.php#631

SQLSTATE[23000]: Integrity constraint violation: 1048 
Column 'link_id' cannot be null
C:\...\vendor\laravel\framework\src\Illuminate\Database\Connection.php#380

重申一下,我确实在Laravel Debugbar中获取了值,但在之后的方法调用中却没有!

编辑:

在我的LinkContact班级link_id中有我的可填写属性:

class LinkContact extends Model
{
    protected $fillable = ['type', 'link_id', 'institution_contact_id'];

    // rest of the class
}

2 个答案:

答案 0 :(得分:1)

值得注意的是:

$newLink->contacts()->associate($linkContact);

在这种情况下,运行如下的查询:

UPDATE `link_contacts` SET `link_id` = 1 WHERE `id` = 4;

因此,如果您在创建中设置link_id,则无需运行关联。如果内存服务,您可以运行$newLink->contacts()->create([...])而不是create()associate()

由于Eloquent的工作方式,外键将始终通过运行任何设计为自动插入此数据的辅助方法进行更新/插入,但您手动指定密钥,这意味着它受$fillable的约束。我会看一下,如果您当前没有,请将link_id添加到该数组中。

答案 1 :(得分:-1)

尝试

$newLink->save();

之前打电话

$newLink->id

只有在数据保存在数据库中后才会生成id,因此在此之前无法知道它。