【问题标题】:Unable to associate models without manually assigning the foreign key in Laravel 5无法在 Laravel 5 中手动分配外键的情况下关联模型
【发布时间】:2015-05-16 18:56:50
【问题描述】:

在 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];

});

【问题讨论】:

  • 我认为您忘记将实际代码(产生错误)放在您的问题中
  • 发布您的帐户模型和事件模型

标签: php eloquent laravel-5


【解决方案1】:

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

使用fill() 代替create() 设置所有值而不保存:

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

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

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

【讨论】:

  • 啊!好的,这完全有道理。感谢您指出这一点!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 2013-10-17
  • 1970-01-01
  • 2018-09-08
  • 2017-05-29
  • 1970-01-01
  • 2014-10-15
相关资源
最近更新 更多