sqlite 我希望附加到标记,但在NULL上收到了对成员函数Attach()的错误调用

gtlvzcf8  于 2022-11-15  发布在  SQLite
关注(0)|答案(1)|浏览(84)

我想为我的博客项目创建标签|laravel
在模型中,我在模型中建立了多对多关系,但当我想要附加时,我收到以下错误:
到空的成员函数Attach()
这是我的博客模式:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use User;

class Blog extends Model
{
    use HasFactory;

    protected $fillable = [
        'name',
        'body',
    ];

    /**
     * Get the blog that owns the user.
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function tags()
    {
        $this->belongsToMany(Tag::class);
    }
}

这是我的标签模型:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    use HasFactory;

    public function blogs()
    {
        $this->belongsToMany(Blog::class);
    }
}

它是我的标签和BLOG_TAG表

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });

        Schema::create('blog_tag', function (Blueprint $table) {
            $table->integer('blog_id')->unsigned()->index();
            $table->foreign('blog_id')->references('id')->on('tags')->onUpdate('cascade')->onDelete('cascade');
            $table->integer('tag_id')->unsigned()->index();
            $table->foreign('tag_id')->references('id')->on('blogs')->onUpdate('cascade')->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tags');
        Schema::dropIfExists('blog_tag');
    }
};

这是我的博客桌

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('blogs', function (Blueprint $table) {
            $table->id();
            $table->integer('user_id');
            $table->string('name');
            $table->longText('body');
            $table->timestamps();

            $table->foreign('user_id')
                  ->references('id')
                  ->on('users')
                  ->onUpdate('cascade')
                  ->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('blogs');
    }
};

它是我的控制器

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use function Ramsey\Uuid\v1;
use App\Models\User;
use App\Models\Blog;
use Illuminate\Support\Facades\Auth;
use DateTime;

class BlogController extends Controller
{
    public function __construct() {
        $this->middleware('auth')->only('create');  
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('welcome');
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('blog.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request, Blog $blog)
    {
        $validated = $request->validate([
            'name' => 'required|max:100|min:3',
            'body' => 'required|min:30',
        ]);

        $name = $request->input('name');
        $body = $request->input('body');

        $blog->insert(['user_id' => Auth::id(),
                       'name' => $name,
                       'body' => $body,
                       'created_at' => new DateTime,
                       'updated_at' => new DateTime
                    ]);

        $blog->tags()->attach(1);

        $request->session()->flash('sucsess', 'blog created succsessfully');
        return back();
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($username, $blogName, User $user)
    {
        $user = $user->where('name', $username)->first();
        $blog = $user->blogs->where('name', $blogName)->first();
        
        // return $user->blogs->where('name', $blogName);
        return view('blog.show', compact('user', 'blog'));
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($username, $blogName, User $user)
    {
        $user = $user->where('name', $username)->first();
        $blog = $user->blogs->where('name', $blogName)->first();
        
        $this->authorize('edit-blog', $user->id);
        return view('blog.edit', compact('user', 'blog'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $validated = $request->validate([
            'body' => 'required|min:30',
        ]);

        Blog::find($id)->update([
            'body' => $request->input('body')
        ]);

        $request->session()->flash('sucsess', 'blog created succsessfully');
        return back();
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy(Request $request, $id)
    {
        Blog::find($id)->delete();
        $request->session()->flash('sucsess', 'blog deleted succsessfully');
        return redirect()->route('dashboard');
    }
}

我在堆栈溢出上看到了与您类似的问题,但没有人回答我的问题请帮助我

quhf5bfb

quhf5bfb1#

尝试:

$newBlog = $blog->insert(['user_id' => Auth::id(),
               'name' => $name,
               'body' => $body,
               'created_at' => new DateTime,
               'updated_at' => new DateTime
            ]);

$newBlog->tags()->attach(1);

相关问题