Laravel - 允许用户在创建帖子时插入类别,如果不存在则创建新类别

时间:2017-02-11 16:22:33

标签: php mysql laravel eloquent

因此,我正在尝试为用户创建功能,以便在创建帖子时添加多个类别。

这是传递给控制器​​的字符串示例:

$request['categories'] = "Sports, Football, Finals";
  • 我需要做的第一件事是分割字符串,清理它 来自blankspaces并创建一个数组。
  • 然后检查每个类别是否存在,否则创建新类别。 Laravel firstOrCreate()方法可能非常适合这种情况。
  • 最后能够为每个帖子关联多个类别。

这是我到目前为止所做的:

TABLES

帖子

Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
            $table->string('title');
            $table->text('body');
            $table->integer('user_id');


        });

类别

Schema::create('categories', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
            $table->string('name');
        });

category_post

Schema::create('category_post', function(Blueprint $table) {
    $table->integer('category_id')->unsigned();
    $table->integer('post_id')->unsigned();
    $table->foreign('category_id')->references('id')->on('categories')->onUpdate('cascade')->onDelete('cascade');
    $table->foreign('post_id')->references('id')->on('posts')->onUpdate('cascade')->onDelete('cascade');
});

模型

发布

class Post extends Model
{
    public function categories()
    {
        return $this->hasMany('App\Category');
    }
}

分类

class Category extends Model
{
    public function post()
    {
        return $this->belongsToMany('App\Post');
    }
}

我不知道我是否正确设置了表格,如果我建立了正确的模型关系,我对如何设置控制器 感到无能为力。

我从这些帖子中获得了一些灵感:

  1. How to insert a post with multi category and with multi column deferent category in laravel?
  2. https://laracasts.com/discuss/channels/general-discussion/eloquent-attach-method-for-multiple-inserts-into-a-pivot-table

1 个答案:

答案 0 :(得分:1)

首先,在many to many Eloquent relationships中,您必须在两个模型中使用belongsToMany函数,因此请更改您的Post模型:

public function categories()
{
    return $this->belongsToMany('App\Category');
}

此外,将post模型中的Category功能重命名为posts,并将protected $fillable = ['name'];添加到Category型号

最后,对于控制器方法,您可以使用以下代码:

$categoryStr = $request->input('categories');
$categories = array_map('trim', explode(',', $categoryStr));
foreach ($categories as $category) {
    $catModel = App\Category::firstOrCreate(['name' => $category]);
    $catModel->posts()->save($post); //$post can be the post model that you want to associate with the category
}