2017-02-11 6 views
0

Так что я пытаюсь создать функцию для пользователей, чтобы добавить несколько категорий при создании сообщения.Laravel - позволяет пользователям вставлять категории после создания сообщения и создавать новые, если они не существуют

Это пример строки получение передается в контроллер:

$request['categories'] = "Sports, Football, Finals"; 
  • Первое, что мне нужно сделать, это разделить строку, очистить его от blankspaces и создать массив.
  • Затем проверьте каждую категорию, если она существует, в противном случае создайте новую. Метод Laravel firstOrCreate() может быть хорошо подходит для этого.
  • Наконец-то возможность связывать несколько категорий для каждого сообщения.

Это то, что я до сих пор:

ТАБЛИЦЫ

сообщения

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

Во-первых, в 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 
} 
+0

Выглядит хорошо, но я получить ошибку 'MassAssignmentException в строке Model.php 452: имя в Model.php line 452 в Model-> fill (array ('name' => 'test')) в Model.php line 288 на Model- > __ construct (array ('name' => 'test')) в Model.php line 504 ... ' –

+1

О, просто добавьте следующую строку в свою модель' Category': 'protected $ fillable = ['name'];' – Paras

+0

Хмм, теперь я получаю сообщение об ошибке 'Call to undefined method Illuminate \ Database \ Query \ Builder :: attach() ' Это моя категория: ' принадлежитToMany ('App \ Post'); } protected $ fillable = ['name']; } ' Почтовая модель: ' belongsToMany ('App \ Категория'); \t} } ' –