下面的代码显示了我的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
}
答案 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,因此在此之前无法知道它。