首页 > 解决方案 > 如何使用单一表单(Laravel)在 2 个表中插入记录?

问题描述

控制器

public function store_resto(Request $request){
        // dd($request->all());
        $restaurant = new Restaurant();
        $restaurant->name = $request->input('name');
        $restaurant->email = $request->input('email');
        $restaurant->address = $request->input('address');
        $restaurant->save();
        $image = $request->hasfile('image');
            $photo = rand(1,9999).'.'.$image;
            $path = public_path().'/files/';
            $image->move($path, $photo);
                 RestoImage::create([
                     'image'=>$image,
                     'resto_id'=>$restaurant->id,
                      ]);

        $request->session()->flash('status', 'Restaurant added successfully');  
        return redirect('list');
    }

查看文件

<form method="post" action="{{route('store_resto')}}" enctype="multipart/form-data">
@csrf
<div class="form-group">
    <label>Resto Name</label>
    <input type="name" name="name" class="form-control">
</div>
<div class="form-group">
    <label>Email</label>
    <input type="email" name="email" class="form-control">
  </div>
  <div class="form-group">
    <label>Address</label>
    <input type="text" name="address" class="form-control">
  </div>
  <div class="form-group">
    <label>Image</label>
    <input type="file" name="image" class="form-control">
  </div><br>
  <button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>

恢复图像模型

class RestoImage extends Model
{
    
    use HasFactory;
    protected $fillable = ['image','resto_id'];
    public function restaurants(){
        $this->belongsTo(Restaurant::class, 'resto_id');
    }

}

餐厅模型

class Restaurant extends Model
{
    use HasFactory;
    public $timestamps = false;

    public function menus(){
        $this->hasMany(Menu::class);
    }
    public function restoimage(){
        $this->hasOne(RestoImage::class, 'resto_id');
    }
}

每家餐厅将有 1 张图片。当管理员提交表单时,应在两个表中插入 1 条记录,即餐厅和 resto_images。我尝试过这种方式,但是当我提交表单时,它显示错误“调用 bool 上的成员函数 move()”。如果我做错了,请纠正我。提前致谢。

标签: laravelfile-upload

解决方案


在这里,我处理了您的代码来解释这些事情是如何工作的。这是一个可以帮助您的示例。不是两个,您可以从控制器的一个功能中添加这么多表。如果您找到解决方案或出现错误的原因,请批准我的回答。

您有错误,因为代码找不到您的图像格式或我的:type(png, jpeg)

$photo = rand(1,9999).'.'.$image;

解决方案-您必须通过此代码获取图像格式或扩展名

$extention          = $emp_image_file->getClientOriginalExtension();

你的解决方案应该是这样的

  $path1 = 'assets/img/emp/'; 
              $destinationPath1    = $path1;
              $photo_file         = $request->file('image');
              $photo='';
              if($photo_file){
                $file_size = $photo_file->getSize();
                    
                    $image_name         = $photo_file->getClientOriginalName();

                    $extention          = $photo_file->getClientOriginalExtension();

                    $photo = value(function() use ($photo_file){
                    $filename = time().'.'. $photo_file->getClientOriginalExtension();
                    return strtolower($filename);
                    });
                    $photo_file->move($destinationPath1, $photo);

                  
                }

将 js 放入视图文件中

<script type="text/javascript">


  function readURL(input) {
  if (input.image && input.image[0]) {
    var reader = new FileReader();
    
    reader.onload = function(e) {
      $('#imagePreview').attr('src', e.target.result);
    }
    
    reader.readAsDataURL(input.files[0]);
  }
}
</script>

这是你输入

<input type="file" class="form-control" name="image"  >

我也为其他访客工作过一次


public function store_resto(Request $request){

       <!-- validation code begins -->
        $this->validate($request, [
            'name'=>'required|max:120',
            'email'=>'required|email|unique:users',
            
        ]);
        <!-- validation code ends -->

 $data = $request->all(); 

        $table1 =  Required_Model1::create([
       
        'name'     =>$data['emp_name'],
        'email'    =>$data['email'],
             
        ]);

        $table2 =  Required_Model2::create([
        

        'name'                 => $data['emp_name'],
        'code'                 => $data['emp_code'],
        'status'               => $data['emp_status'],
        'email'               => $data['email'],
        'gender'               => $data['gender'],
        

        'table1_id'              => $table1->id,
        ]);

        $table3 =  Required_Model3::create([
      
        'role' => $data['role'],
        'table1_id' => $table1->id,
        'table2_id' => $table2->id,


          if(isset($table1,  $table2, $table3)) {
            $request->session()->flash('status', 'Restaurant added successfully');
              return redirect()->route('employee-manager');
              }else{
                  return redirect()->back();
              }

        
    }

如果您不想验证或强制执行,请评论或删除这部分代码。

$this->validate($request, [
        'name'=>'required|max:120',
        'email'=>'required,
        
    ]);

上面的代码说明

  1. 列名必须填写 120 个字符或不能为空。
  2. 必须填写列电子邮件。如果这两个不满足,它将重定向回来。

下面的代码 如果像上面的代码一样设置验证,这将按照定义进行检查和工作。如果设置了验证,他们会检查两个字段名称和电子邮件,如果他们填写或不为空,它将继续进行。如果设置了验证字段未填充或空白,它们将重定向回来。如果没有设置验证,它将继续进行。

if(isset($table1,  $table2, $table3)) {
        $request->session()->flash('status', 'Restaurant added successfully');
          return redirect()->route('employee-manager');
          }else{
              return redirect()->back();
          }

改变这两行

<input type="name" name="name" class="form-control" required="true" />
 <input type="email" name="email" class="form-control" required="true" />

模型1应该是这样的

class Required_Model1 extends Model
   {
    
    
    protected $fillable = ['name','email'];
   

  }

Model 2应该是这样的

class Required_Model2 extends Model
   {
    
    
    protected $fillable = ['name','code', 'status', 'email', 'gender', 'table1_id'];
   

  }

Model 3应该是这样的

class Required_Model3 extends Model
   {
    
   
    protected $fillable = ['role','table1_id', 'table2_id'];
   

  }

让我们谈谈您发布时的错误 您遇到错误是因为您想以布尔值的形式移动图像名称。这是给你一个标准代码,你可以使用它

$path1 = 'assets/img/emp/'; 
              $destinationPath1    = $path1;
              $emp_image_file         = $request->file('employee_images');
              $emp_image='';
              if($emp_image_file){
                $file_size = $emp_image_file->getSize();
                    
                    $image_name         = $emp_image_file->getClientOriginalName();
                    $extention          = $emp_image_file->getClientOriginalExtension();
                    $emp_image = value(function() use ($emp_image_file){
                    $filename = time().'.'. $emp_image_file->getClientOriginalExtension();
                    return strtolower($filename);
                    });
                    $emp_image_file->move($destinationPath1, $emp_image);

                  
                }

把它放在你想保存的表中

 'photo'                => $emp_image,

在您的视图中添加此内容,确保您按照您的要求进行编辑

<script type="text/javascript">


  function readURL(input) {
  if (input.employee_images && input.employee_images[0]) {
    var reader = new FileReader();
    
    reader.onload = function(e) {
      $('#employee_imagesPreview').attr('src', e.target.result);
    }
    
    reader.readAsDataURL(input.files[0]);
  }
}
</script>

这是输入

<input type="file" class="form-control" name="employee_images"  >

推荐阅读