laravel 无法将记录保存到数据库

Posted

技术标签:

【中文标题】laravel 无法将记录保存到数据库【英文标题】:laravel Cannot save records to DB 【发布时间】:2020-01-20 16:14:08 【问题描述】:

我正在用 laravel 构建一个博客系统。

现在我有一个包含姓名、电子邮件地址和密码的博客表。

除了默认的帐号表,我还想保存个人资料图片和介绍。 就我而言,它们属于博客表。 但我无法保存这两条记录。

我无法弄清楚为什么无法将个人资料记录插入到我的数据库中。

我的用户角色是博主。

我可以在 url 上看到 ?_token。

博主表

Schema::create('bloggers', function (Blueprint $table) 
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        );

博客表

Schema::create('blogs', function (Blueprint $table) 
            $table->bigIncrements('id');
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('bloggers');
            $table->string('image');
            $table->string('introduction');
            $table->timestamps();
        );

blogger.php

public function blogs()
    
        return $this->hasMany(Blog::class, 'user_id');
    

blog.php

public function user()
        return $this->belongsTo(Blogger::class, 'user_id');
    

bloggersController.php

public function store(Request $request, Blogger $blogger_id)
        $blogger_id = DB::table('bloggers')->where('id', $blogger_id)->get();

        Auth::guard('blogger')->user();

        if($request->hasfile('image'))
            $file = $request->file('image');
            $ext = $file->getClientOriginalExtension();
            $filename = time().'.'.$ext;
            $file->move('bloggers/', $filename);

            $blog = Blog::updateOrCreate(
                  ['user_id' => $blogger_id],
                  [
                      'image'=>$filename,
                      'introduction' => $request->introduction,
                  ]
              );
      
       return view('bloggers.create')->with('bloggers', Blogger::all())->with('blogs', Blog::all());

    

web.php

Route::get('/create', 'BloggersController@store')->name('blogs.store');

create.blade.php

<form action=" route('blogs.store') " enctype="multipart/form-data">
@csrf
 <img src="asset('blog-image/alexandre-chambon-zxmSX2-GQBc-unsplash.jpg')"  class="card-img">
            <div class="image-preview" id="imagePreview">
                @if(empty(Auth::guard('blogger')->user()->blog->image))
                <img src="asset('avatar/avatar.png')" id="image-preview__image" >
                @else
                <img src="asset('bloggers/')/ Auth::guard('blogger')->user()->blog->image"  id="preview" >
                @endif
            </div>


            <input type="text" class="name" value=" Auth::guard('blogger')->user()->name " name="name">

            <textarea name="introduction" id="" cols="30" rows="10" class="profile">
            @if(!empty(Auth::guard('blogger')->user()->blog->introduction)) Auth::guard('blogger')->user()->blog->introduction @endif
            </textarea>



            <div class="preview">
                    <input type="file" id="file" class="file1" accept="image/*" name="image">
                <label for="file">
                    Add profile photo
                </label>
            </div>
<button type="submit" id="register">Register</button>
</form>

【问题讨论】:

这些列在您模型的fillable 属性中吗? 是的。我有一个受保护的 $fillable 。 为什么 Auth::guard('blogger')->user();没有分配给变量? @YoheiUmezu 方法名有错别字。它应该是 $request-&gt;hasFile 而不是 $request-&gt;hasfile 。除此之外,您的控制器函数还有第二个参数作为 Blogger 实例,但如果您将它传递给路由,它应该是字符串。此外,您应该使用 POST 或 PUT 请求提交图像(文件)。 @PassionInfinite 谢谢我修复了 hasFile。你的意思是我需要在路由中从 get 更改为 POST 吗? 【参考方案1】:
public function store(Request $request, Blogger $blogger)

         // If you are using route model you already have a model instance
        $blogger_id = $blogger->id

        //Auth::guard('blogger')->user();

       if($request->hasFile('image'))

           $file = $request->file('image');
           $ext = $file->getClientOriginalExtension();
           $filename = time().'.'.$ext;
           $file->move(public_path("bloggers"), $filename);
           $path = '/bloggers/' . $filename;

           $blog = Blog::updateOrCreate(
              ['user_id' => $blogger_id],
              [
                 'image'=>$filename,
                 'introduction' => $request->introduction,
              ]
          );
      
      return view('bloggers.create')->with('bloggers', Blogger::all())->with('blogs', Blog::all());


【讨论】:

谢谢。但是我遇到了一个新错误尝试获取非对象的属性“id”。 你抛弃了你的 $blogger_id 吗?它可能是空转储($blogger_id); 不,我还有 Blogger $blogger_id。 好吧,我明白了,因为你使用的是依赖注入 (Blogger $blogger_id) 你可以简单地使用公共函数 store(Request $request, Blogger $blogger) 然后 $blogger_id = $blogger->id ; 所以你的意思是我需要从 $blogger_id = DB::table('bloggers')->where('id', $blogger_id)->value('id'); 替换到 $blogger_id = $blogger->id; ?

以上是关于laravel 无法将记录保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 中将一些用户信息保存到不同的表中

“无法将图像数据写入路径” - Laravel 图像干预

Laravel 将动态输入数据数组保存到数据库中

如何使用laravel中的多个关系将记录保存在数据库中

如何在更新 Laravel 中的记录时将表单发布数据加载到模型中

只有 JSON 中的第一个值保存到数据库 - Laravel