簡體   English   中英

在Laravel 5中無需手動分配外鍵就無法關聯模型

[英]Unable to associate models without manually assigning the foreign key in Laravel 5

嘗試在Laravel 5中將子模型與父模型關聯時遇到問題。

在文檔中“ 插入相關模型 ”的“關聯模型(屬於)”部分下,我應該能夠:

  • 創建一個子模型實例: $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();
});

因此,當我創建打算與父帳戶關聯的Events實例時,會拋出異常:

SQLSTATE [23000]:違反完整性約束:1048列“ account_id”不能為空(SQL:插入eventsdate_of_donationdate_last_donation_letter_sentaccount_idupdated_atcreated_at )值(2015-05-16 date_last_donation_letter_sent 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];

});

問題是, create()實例化一個新模型並直接保存它。 因此,您實際上將其保存了兩次。 但是,第一次沒有設置外鍵。

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

$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' => '']);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM