Laravel:Mediable Duplication错误SQLSTATE [23000]:完整性约束违规:1062重复条目

时间:2017-12-24 11:19:13

标签: php mysql laravel-5

我正在尝试使用$media->onDuplicateReplace(); 在代码中:

public function update($id){

        $user = User::find($id);
        $user->name=request('name');
        $user->email=request('email');
        $user->password=request('password');
        $user->description=request('description');
        $user->country_id=request('country');
        $user->state_id=request('state');
        $user->city_id=request('city');
        $user->works_at=request('works_at');
        $user->studies_at=request('studies_at');


        $uid = $id;
        $img = Image::make(request('file'));

        $img->resize(800, null, function ($constraint) {
            $constraint->aspectRatio();
        });

        $img->crop(800,800);
        $img->save('uploads/users/images/'.$uid.'.jpg');

        $media = MediaUploader::import('uploads', 'users/images', $uid, 'jpg');
        $media->onDuplicateReplace();
        $user->attachMedia($media, 'image');

        $user->update();
        return redirect('/');
    }

但我不会为我工作,继续发送错误:

  

SQLSTATE [23000]:完整性约束违规:1062重复条目   '上载用户/图像-1- JPG'为了钥匙   ' media_disk_directory_filename_extension_unique' (SQL:插入到   媒体(磁盘,目录,文件名,扩展名,mime_type,   aggregate_type,size,updated_at,created_at)values(uploads,   用户/图像,1,jpg,image / jpeg,image,49344,2017-12-24 10:10:07,   2017-12-24 10:10:07))

这件事也不行:

'on_duplicate' => Plank\Mediable\MediaUploader::ON_DUPLICATE_REPLACE,

如果文件已存在,我怎样才能让媒体替换文件?

2 个答案:

答案 0 :(得分:0)

当我回到MySQL 5.5。*时,发现了这样的问题。 syncMediaattachMedia没关系,因为media表在连接到Mediable之前就被弄乱了。 MySQL 5.6可能消除了许多其他良好的更改,因此我建议对其进行更新。因此,请使用syncMedia附加媒体。

如果原因似乎不同,或者您无法以我的身份更新服务器上的MySQL,则存在“肮脏”的解决方法。删除当前媒体并创建新媒体,因此不会出现冲突:

if ($user->hasMedia('image')) $user->firstMedia('image')->delete();
$media = MediaUploader::import('uploads', 'users/images', $uid, 'jpg');
$media->onDuplicateReplace();
$user->attachMedia($media->upload(), 'image');

答案 1 :(得分:0)

也许您对.env文件中指定的数据库使用了不同的数据库连接?

对我来说就是这种情况,Medicable总是在错误的数据库中进行检查。 要解决此问题,我必须实现自己的媒体模型,扩展默认模型,以便能够像在其他模型中一样在模型本身中定义连接。

因为在我的情况下,连接将在运行时指定(带有连接详细信息输入的laravel控制台工具)。

use Plank\Mediable\Media as PlankMedia;

class Media extends PlankMedia
{
    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
        if(!empty(config('database.connections.destination'))){
            $this->setConnection('destination');
        }
    }
}

,在mediable.php配置文件中,我指定了我的自定义模型:

'model' => App\Models\Media::class,