nhalstead / transferable
将一个模型实例关联关系转移到另一个同类型模型实例。
1.0.3
2022-03-13 17:56 UTC
Requires
- php: ^7.3|^8.0
- illuminate/database: ^7.0|^8.0|^9.0
Requires (Dev)
- mockery/mockery: ^1.3.1
- orchestra/testbench: ~6.0
- phpunit/phpunit: ^9.0
This package is auto-updated.
Last update: 2024-09-13 23:51:46 UTC
README
使Laravel模型关系可转移!
当您希望模型关系被分配给另一个模型(相同类型)而不是被删除或设置为null时,这是完美的。
安装
composer require nhalstead/transferable
如何使用
在模型本身上,您需要添加use语句,并可选地添加implements以阻止模型被删除。
<?php namespace App\Models; use nhalstead\Transferable\Interfaces\NoDanglingRelationships; use nhalstead\Transferable\Traits\TransferableRelationship; use Illuminate\Database\Eloquent\Model; class User extends Model implements NoDanglingRelationships { use TransferableRelationship; protected $transferable = [ "items" ]; public function items() { return $this->hasMany(Items::class); } }
通过附加接口NoDanglingRelationships
,您可以在删除之前进行检查,以确保没有连接的关系可以被转移。
接下来做什么?
如果我们还有可以转移的关联关系仍然附加,我们可以阻止删除操作,接下来做什么?
此包为所有使用TransferableRelationship
的模型提供了一些额外功能,以使事情变得简单和高效。如果一个模型想要将关系转移到另一个模型,可以使用下面的示例
<?php $oldUser = User::find(1); $newUser = User::find(2); // Doing `delete()` will trigger an exception so you need // to transfer any items that are connected to another model. // Transfer relationships to another item. $oldUser->transferTo($newUser); // Returns the total rows changed. // Bob's your uncle, now oldUser can be deleted. $oldUser->delete(); ?>
它为什么高效?这将使用模型的关系来确定需要在数据库中更新什么,并在数据库上运行查询以更新关系,而不需要进行任何额外的调用以获取所有ID并断开连接。
还有其他什么?
没有其他了,此包提供了一些额外的调试方法和收集可转移关系信息的方法,请参见下文
// Return the number of transferable items attached to this model $newUser->countTransferable(); // Return boolean if it would have any dangling relationships if deleted. // The false param tells it not to throw an Exception $newUser->checkDangling(false);