我的模型User
有这样的关系:
public $attachMany = [
'logos' => ['System\Models\File', 'delete' => true]
];
public $hasMany = [
'jobs' => ['Acme\Plugin\Models\Job']
];
我在Job
模型中也有以下关系:
public $attachOne = [
'logo' => ['System\Models\File', 'delete' => true]
];
因此,User
可以附加大量徽标,当用户创建Job
时,他们可以附加一个徽标。
当User
创建Job
并为其添加徽标时,我需要他们能够选择附加已附加到User
的其中一个徽标,但我不希望它成为实际关系(即:不多对多关系类型),而是完全复制File
,以便用户以后决定要在以后删除他们的一些徽标,它不会影响附加到作业的徽标。
我理论上已经解决了这个并回答了我自己的问题,但它非常混乱,我不禁想到可能有一种更简单的方法。
// Get the File model
$chosenLogo = \System\Models\File::find(1);
// Save the contents of the file to local storage
Storage::disk('local')->put('tempLogos/' . $chosenLogo->disk_name, $chosenLogo->getContents());
// Get the job
$job = \Acme\Plugin\Models\Job::find(34);
// Create a new File and specify path for data
$file = new \System\Models\File;
$file->data = base_path('storage/app/tempLogos/' . $chosenLogo->disk_name);
// Save file then attach logo to job
$file->save();
$job->logo()->add($file);
它有效,但它有很多混乱。有更简单的方法吗?
答案 0 :(得分:0)
尝试使用MorphTo关系:https://octobercms.com/docs/database/relations#polymorphic-relations 您可以创建徽标模型并将其转换为用户和作业模型。
答案 1 :(得分:0)
也许解决方案可以与行为一起使用。使用\System\Models\File
或clone()
方法扩展copy()
课程,并使用此方法:
public static function clone(){
Storage::disk('local')->put('temp/' . $this->disk_name, $this->getContents());
// Create a new File and specify path for data
$file = new \System\Models\File;
$file->data = base_path('storage/app/temp/' . $this->disk_name);
// Save file then attach logo to job
$file->save();
return $file;
}
答案 2 :(得分:0)
没有更简单的方法,您的解决方案是在磁盘上存储已存储文件的物理副本并在此副本的数据库中记录新\System\Models\File
的正确方法。