как обновить две таблицы с помощью db: transaction laravel - PullRequest
0 голосов
/ 01 августа 2020

это мой код модели видео

    class Video extends Model
{
    protected $table = 'lokit_video';
    protected $fillable = 
    [
        'title',
        'cover_img',
        'trailer',
        'url',
        'order_',
        'active',
        'description',
        'lokit_category_id',
        'duration'
    ];
    public function lokit_category(): BelongsTo
    {
        return $this->belongsTo(Category::class);
    }

    public function video_series() 
    {
        return $this->hasMany(VideoSeries::class, 'lokit_video_id');
    } 
 }

это мой код модели VideoSeries

    class VideoSeries extends Model
{
    protected $table = 'lokit_video_series';
    protected $fillable = [
        'lokit_video_id',
        'lokit_series_id',
        'series',
        
    ];

    public function lokit_video(): BelongsTo
    {
        return $this->belongsTo(Video::class, 'lokit_video_id');
    }

    public function serie(): BelongsTo
    {
        return $this->belongsTo(Series::class, 'lokit_series_id');
    }
}
 

в моем контроллере кода

        public function update(Request $request,$id) {
        $data = $request->all();
        $validator = Validator::make($data, [
            'title'                  => 'required',
            'order_'  => 'required',
            'active'               => 'required',
            'url'               => 'required',
            'category'           => 'required'
        ]);
        $errors=$validator->errors();
        if ($validator->fails()) {
            return Redirect::to('admin/video/video/'.$id.'/edit')
                ->withErrors($errors)
                ->withInput();
        }
        $data['lokit_category_id'] = $data['category'];
        unset($data['category']);
        DB::beginTransaction();
        try {
            if($request->hasFile('cover_img')) {
                $uniquename='cvr_'.md5($id);
                $filename=$uniquename.'.'.$request->file('cover_img')->getClientOriginalExtension();
                $path=public_path('storage/media');
                $request->cover_img->move($path, $filename);
                $data['cover_img']=$filename;
                
                $this->_resizeimg($path,$filename,$uniquename);  
            }
            $isi = Video::find($id);
            if($isi->url != $data['url']) {
                $name = str_replace("_", '',$data['url']);
                $manager = new MediaManager('/uploads');
                $manager->newFolder($name);
                $data['duration'] = $this->getDuration($data['url']);
            }
            
            $isi->update($data);
            if (isset($request->series) && $request->series) {
                $video_series = new VideoSeries();
                $video_series->lokit_video_id =$id;
                $video_series->lokit_series_id = (int)$request->series;
                $video_series->series = (int)$request->episode;
                $isi->video_series()->update($video_series);
            }
            DB::commit();
            return Redirect::to('admin/video/video');
        } catch (\Exception $ex) {
            DB::rollback();
            throw $ex;
        }
   

     }

Когда я попробовал код выше, у меня даже возникли ошибки, такие как аргумент 1, который был передан в Illuminate \ Database \ Eloquent \ Builder :: update (), должен иметь тип массива, данный объект, как я могу исправить эту ошибку и почему я получил ошибка?

Ответы [ 2 ]

0 голосов
/ 01 августа 2020

Удалите это

$isi->video_series()->update($video_series);

Вам не нужно делать инструкцию обновления, как указано выше, поскольку вы уже добавили идентификатор видео в lokit_video_id при создании записи video_series. ($video_series->lokit_video_id =$id;)

Но вам нужно сохранить этот экземпляр модели. Так что сделайте это

$video_series->save();
0 голосов
/ 01 августа 2020

Вам нужно прикрепить , так как есть такой метод, как update() для обновления первичных и внешних ключей связанных таблиц

Так что это неправильно $isi->video_series()->update($video_series);

Вместо этого используйте

$isi->video_series()->attach($video_series);
...