【问题标题】:Laravel:Mediable Duplication error SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entryLaravel:Mediable Duplication 错误 SQLSTATE [23000]:完整性约束违规:1062 重复条目
【发布时间】:2018-06-06 04:57:10
【问题描述】:

我正在尝试使用$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 重复条目 'uploads-users/images-1-jpg' 用于密钥 'media_disk_directory_filename_extension_unique'(SQL:插入 媒体(磁盘、目录、文件名、扩展名、mime_type、 aggregate_type, size, updated_at, created_at) 值(上传, 用户/图片, 1, jpg, 图片/jpeg, 图片, 49344, 2017-12-24 10:10:07, 2017-12-24 10:10:07))

这东西也不行:

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

如果文件已经存在,我如何制作媒体来替换文件?

【问题讨论】:

    标签: php mysql laravel-5


    【解决方案1】:

    回到 MySQL 5.5.* 时,我注意到了这样一个问题。 syncMediaattachMedia 无关紧要,因为 media 桌子在连接到中间件之前有点混乱。 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');
    

    【讨论】:

      【解决方案2】:

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

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

      因为在我的情况下,连接将在运行时指定(带有连接详细信息输入的 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,
      

      【讨论】:

        猜你喜欢
        • 2016-05-23
        • 2015-03-31
        • 1970-01-01
        • 2017-08-04
        • 2016-01-16
        • 2014-09-16
        • 2020-12-20
        • 2016-03-10
        • 2019-09-12
        相关资源
        最近更新 更多