Php 如何使用db:transaction-laravel更新两个表
这是我的视频模型代码Php 如何使用db:transaction-laravel更新两个表,php,mysql,laravel,laravel-5,Php,Mysql,Laravel,Laravel 5,这是我的视频模型代码 class Video extends Model { protected $table = 'lokit_video'; protected $fillable = [ 'title', 'cover_img', 'trailer', 'url', 'order_', 'active', 'description',
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');
}
}
这是我的视频系列模型代码
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;
}
}
当我尝试上面的代码时,我甚至遇到了一些错误,例如传递给Illumb\Database\Eloquent\Builder::update()的参数1必须是数组类型,给定的对象,如何修复此错误以及为什么会出现错误?您需要,因为有类似于update()的方法
用于更新相关表的主键和外键
所以这是错误的$isi->video_series()->update($video_series)代码>
改用
$isi->video_series()->attach($video_series);
去掉这个
$isi->video_series()->update($video_series);
您不需要像上面那样进行更新声明,因为在创建视频系列条目时,您已经在lokit_video_id中添加了视频的id。($video\u series->lokit\u video\u id=$id;
)
但您需要保存该模型实例。这样做吧
$video_series->save();
我尝试了您的代码,但出现了一个错误,如调用undefined方法illumb\Database\Eloquent\Relations\HasMany::attach(),您似乎还没有配置(HasMany)Video
和VideoSeries
模型之间的关系请在帖子中分享模型和模式,并解释你想做什么。我已经分享了我的模型代码。我想再给你一个建议。就我所知,video_系列是一个透视表,所以为什么不在video和系列之间建立多对多关系呢。这样,您就不必创建视频系列模型,视频和系列模型将直接链接。让我知道你对这件事的看法。