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

});

===============>>#1 票数:0 已采纳

问题是, 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' => '']);

  ask by Chris Schmitz translate from so

未解决问题?本站智能推荐:

2回复

手动将项目添加到现有对象[Laravel 5]

这是我尝试做的事情: 这将输出: 所以'test' => true将作为一个新键附加,但是我想将它插入到Question所以后者我可以像foreach $q -> test一样访问它$q -> test 所以这是我想要访问项目的方式:
4回复

无法使用MySQL在Laravel中创建外键

我有一个项目,并且已经在命令提示符下的第一个调用了这两个命令: 然后我在音乐迁移文件中创建一个外键,如下所示: 现在,当我运行migrate命令时: 但是我有一个错误: 注意:我将测试几种方式,例如将索引设置为两个字段,...
2回复

如何在Laravel中手动将信息传递给寄存器控制器

创建用户而最终用户不必输入详细信息。 类似于 感谢您的想法和提前反馈:) 用例是。 最终用户通过输入其他电子邮件来邀请其他用户使用该服务,并在向其发送带有创建的详细信息的新电子邮件之前,使用随机密码创建一个用户。
2回复

Laravel使用外键存储模型

我正在尝试存储一个模型,它是一个链接表。 桌子: Game_Has_Users模型: 我要存储一个游戏,然后,应使用用户ID和游戏ID创建Game_Has_Users模型。 但是,我总是收到以下响应:状态:失败,消息:[]。 它没有例外,所以我不知道我做错了什么。
2回复

如何使用laravel / php手动映射集合并获取总金额

我目前有API返回的以下json响应。 我可以使用Laravel Eloquent将其返回。 有几个用户,每个用户都有几个收据。 收据具有类型和状态。 我想尝试获取与收据类型和状态相关的每张收据的总金额。 我能够使用以下返回json响应 $this->user->wit
2回复

迁移外键与Laravel中雄辩的关系

在Laravel 5.1中,我可以看到表列关系可以通过两种方式设置: 1)在迁移表中定义外键。 2)定义模型中的雄辩关系。 我已阅读文件,我仍然对以下内容感到困惑: 我是否需要同时使用或仅需要1个? 同时使用两者是不对的吗? 或者它是否使其多余或引起冲突?
2回复

如何在Laravel中通过外键检索数据?

如何在Laravel中检索数据。 我有一个表用户,其中我有一个字段parent_id ,其中我正在显示其user_id的信息。 现在我想显示登录用户的信息 我试过了 我得到了选定的parent_id,现在我想要该user_id的名称。 我正在尝试 它得到一
1回复

Laravel Eloquent模型中的模型重复键

我无法弄清楚问题出在哪里,我不记得它什么时候首次出现,现在并没有很多问题,但是它浪费了连接,这并不是移动通信的最后目的。 问题出在后面。 这是模型的输出,这种输出适用于任何模型,我的意思是它复制每个与索引相关的值。 我试图遵循函数调用的堆栈并停在 如上所述,我到了这里。
1回复

如何在laravel中链接多个外键

我正在开发一个银行应用程序,在我的Laravel模型中,我有一个叫做交易的表。 在该表中,它有一个名为to_id和from_id的列,它是发送货币的用户的id(from_id)和谁接收货币的ID(to_id),链接到我的User表, 这是CreateTransactionsTable
1回复

我可以将模型关联到laravel中的通知表吗?

我一直在处理通知,并且很快就通过了通知,除非我感到需要删除通知并将其与Post相关联,是否可以将模型与notifications表相关联? 我想到了在创建通知模型之后使用在模型中找到的$table属性。 编辑:或者删除帖子后可以删除通知吗?