nhalstead/transferable

将一个模型实例关联关系转移到另一个同类型模型实例。

1.0.3 2022-03-13 17:56 UTC

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);