پکیج bkwld/cloner در لاراول این امکان را به برنامه نویس میدهد تا بتواند از مدل های Laravel Eloquent و همچنین relationship های آن یک Clone تهیه کند و اطلاعات آن Model را مستقیما در دیتابیس جاری یا حتی در دیگر دیتابیس ها کپی نماید .
برای شروع باید پکیج bkwld/cloner با استفاده از کامپوزر دانلود شود .
composer require bkwld/cloner
بعد از دانلود پکیج ، ServicePrivder آن را به کانفیگ پروژه در دایرکتوری config\app.php در قسمت providers اضافه می کنیم :
Bkwld\Cloner\ServiceProvider::class,
حال Modelهایی که می خواهند Clone شوند باید از trait زیر استفاده کنند ، فرض کنید یک Model به نام Article داریم که میخواهیم آن را Clone کنیم :
class Article extends Eloquent {
use \Bkwld\Cloner\Cloneable;
}
برای duplicate کردن اطلاعات Article در دیتابیس جاری می توان به صورت زیر عمل کرد .
$clone = Article::first()->duplicate();
برای کپی کردن اطلاعات Model در دیگر دیتابیس ها میتوان از شیوه زیر استفاده کرد ، به عنوان مثال می خواهیم Article با آی دی 20 را در دیتابیس backup ، کپی نماییم :
$clone = Article::find(20)->duplicateTo('backup');
فرض کنید Article دارای چندین relation است و میخواهیم دیتای relation های آن را هم clone کنیم ، به عنوان مثال Article دارای یک relation با Comment است و میخواهیم هنگام clone کردن Article ، کامنت های آن را هم clone کنیم :
class Article extends Eloquent
{
use \Bkwld\Cloner\Cloneable;
protected $cloneable_relations = ['comments'];
public function comments() {
return $this->hasMany(Comment::class);
}
}
حال بعد از هر بار duplicate کردن ، دیتای relation ها نیز clone می شوند .
اگر بعضی از فیلدها را در Model های خود به صورت unique تعریف کرده باشید و نخواهید آن ها را کپی کنید ، میتوانید از کد زیر استفاده کنید ، اگر چه این پکیج به صورت پیش فرض id را کپی نمی کند و آن ها را با استفاده از auto-incremente پر میکند ، updated_at و created_at نیز copy نمی شوند .
class Article extends Eloquent
{
use \Bkwld\Cloner\Cloneable;
protected $clone_exempt_attributes = ['slug'];
}