无法在Laravel 5

时间:2015-05-16 18:56:50

标签: php eloquent laravel-5

在尝试将子模型与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:插入eventsdate_of_donationdate_last_donation_letter_sentaccount_idupdated_atcreated_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];

});

1 个答案:

答案 0 :(得分:0)

问题是,\v实例化一个新模型并直接保存它。所以你实际上保存了两次。但是第一次没有外键设置。

而不是create()使用create()设置所有值而不保存:

fill()

或者你也可以使用构造函数(我个人更喜欢这个解决方案)

$event = $events->fill(['date_of_donation' => '2015-05-16', 'date_of_last_donation_letter_sent' => '']);