在尝试将子模型与Laravel 5中的父模型关联时,我遇到了一个问题。
我在Inserting Related Models"关联模式(属于)"我应该能够:
$comment = new Comment(['message' => 'A new comment.']);
$post = Post::find(1);
$comment = $post->comments()->save($comment);
这在概念上对我有意义,我遇到的问题是创建子记录而不手动将父ID分配为外键。
在我的项目中,我有一个父表Accounts
和一个子表Events
。事件模式具有为帐户ID分配的外键约束:
Schema::create('events', function(Blueprint $table)
{
$table->increments('id');
$table->integer('account_id')->unsigned();
$table->foreign('account_id')->references('id')->on('accounts');
$table->timestamp('date_of_donation');
$table->timestamp('date_last_donation_letter_sent');
$table->timestamps();
});
因此,当我去创建我计划关联到父帐户的事件实例时,我会抛出异常:
SQLSTATE [23000]:完整性约束违规:1048列' account_id'不能为空(SQL:插入
events
(date_of_donation
,date_last_donation_letter_sent
,account_id
,updated_at
,created_at
)值(2015-05- 16 ,,, 2015-05-16 17:35:36,2015-05-16 17:35:36))
我理解为什么会抛出错误,因为我没有给Events实例一个外键值。
我可以通过首先获取Accounts记录并像这样创建Events实例来解决这个问题:
$account = $accounts->findOrFail($id);
$event = $events->create(['account_id' => $account->id, ...]);
但它似乎是"关联模型(属于)"的全部观点。部分是为了让你不必须这样做。
我是否遗漏或误解了关联功能应如何工作?
这是我的Account
型号:
<?php namespace Hub;
use Illuminate\Database\Eloquent\Model;
class Account extends Model {
protected $fillable =[
'first_name',
'last_name',
'display_name',
'email',
'zipcode',
'phone_number'
];
public function donationEvents(){
return $this->hasMany('Hub\donationEvent');
}
}
我的Event
型号:
<?php namespace Hub;
use Illuminate\Database\Eloquent\Model;
class Event extends Model {
protected $fillable = [
'account_id',
'date_of_donation',
'date_last_donation_letter_sent'
];
public function donationItems(){
return $this->hasMany('Hub\DonationItem');
}
public function account(){
return $this->belongsTo('Hub\Account');
}
}
此外,这里是触发错误的代码:
Route::get('dev2', function ( Hub\Account $accounts, Hub\Event $events){
$account = $accounts->findOrFail(1);
// This is where I'm trying to create the child record but I get the exception
$event = $events->create(['date_of_donation' => '2015-05-16', 'date_of_last_donation_letter_sent' => '']);
$event = $account->events()->save($event);
return [$account, $event];
});
答案 0 :(得分:0)
问题是,\v
实例化一个新模型并直接保存它。所以你实际上保存了两次。但是第一次没有外键设置。
而不是create()
使用create()
设置所有值而不保存:
fill()
或者你也可以使用构造函数(我个人更喜欢这个解决方案)
$event = $events->fill(['date_of_donation' => '2015-05-16', 'date_of_last_donation_letter_sent' => '']);