Laravel 5分离/删除多态关系

Posted

技术标签:

【中文标题】Laravel 5分离/删除多态关系【英文标题】:Laravel 5 detach / remove polymorphic relation 【发布时间】:2017-02-04 20:04:20 【问题描述】:

我有一个transactions table,可以在其中存储paymentplan 的多态关系。我似乎无法得到的是,当我更新现有事务并删除表单中的payment_idplan_id 时,如何从数据库中清除该关系。

插入(或更新)时,效果很好:

$payment->transactions()->save($transaction);

我尝试了很多东西,detach 方法不起作用,因为它不是多对多关系。

我的模型:

交易:

public function paymentable()

    return $this->morphTo();

付款(和计划):

public function transactions()

    return $this->morphMany(Transaction::class, 'paymentable');

有什么想法吗?

基本上我的问题是,当我对现有事务执行更新时,如果没有提交paymentplan,如何清除paymentable_idpaymentable_type?所以基本上,当 paymentplan 从表单中删除时。我不喜欢使用一些 RAW 查询。

【问题讨论】:

$payment->transactions()->delete(); 不适合你吗? 这实际上从数据库中删除了整条记录,或者我做错了什么。将再次测试它。 根据 Laravel 文档 (https://laravel.com/docs/5.4/eloquent-relationships#updating-belongs-to-relationships),您可以使用 dissociate 方法取消链接您不需要的所有关系 不幸的是,这也不起作用,尝试过。只是说这是一种未知的方法。而且我在任何地方都找不到关于detachingdisociating 多态关系的任何信息。 【参考方案1】:

用户@zgabievi 的评论是正确的。 dissociate() 自 5.0 以来一直存在。这是将其添加到 MorphTo 关系的提交:https://github.com/laravel/framework/commit/3d6727e1764c37e1219b0a1fc7e003ef61615434#diff-4c052acf0022213a4cc23f53ba42720e

我已使用此方法将多态文件记录与其父模型分离。因为在MorphTo中,所以对child调用了dissociate()方法。

例子:

$attachment = new Attachment; // contains 'attachable' morphTo relationship

$note = new Note; // contains morphyMany relationship to Attachment

// save the Attachment through the attachments relationship, sets morph fields and persists to the database
$note->attachments()->save($attachment);

// populate the morph fields without saving
$attachment->attachable()->associate($note);

// clear the morph fields without saving
$attachment->attachable()->dissociate();

【讨论】:

以上是关于Laravel 5分离/删除多态关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.8多态关系`nullableMorphs`不起作用

Laravel 5 具有多态关系的只读视图模型

Laravel 5中的反向多态关系

按他们获得的点数排序评论,Laravel 5.2 多态关系

Laravel 5 检索所有多态模型的最佳方法

Laravel 一对多(多态)关系