Как создать данные в таблице соединений связь «многие ко многим» без создания данных в точке соединения, чтобы

#laravel

Вопрос:

Он вставляет как таблицу внутри тегов, так и теги, которые я хочу просто вставить в таблицу тегов ( переходов ). Потому что, прежде чем вставлять его в таблицы тегов, сначала нужно проверить, будет ли тег вставляться в таблицу тегов уже существует или нет, если существует, просто возьмите идентификатор. Чтобы упростить мою проблему. я просто не включаю код, чтобы проверить, существуют ли теги или нет.

почтовая модель

 public function tags(){ return $this->morphToMany( Tag::class, 'tagable', 'tagables', null, 'tag_id ); }
 

контроллер поста

 // tags table theres a row id 1 with name greeting
$post = Post::create( ['body' => 'Hello World'] );
$post->tags()->create( ['tag_id' => 1] );
 

Таблицы

 // posts table
$table->mediumIncrements('post_id');
$table->string('body');

// tags table
$table->mediumIncrements('tag_id');
$table->string('tag_name');

//tagables table
$table->unsignedMediumInteger('tag_id');
$table->unsignedMediumInteger('tagable_id');
$table->string('tagable_type');
 

Ответ №1:

Я думаю, что самый простой способ сделать это-начать с создания тега с помощью красноречивого метода «firstOrCreate», а затем, когда у вас уже есть новый тег или существующий тег, вы можете добавить этот тег в новый пост. Код может выглядеть примерно так:

 class Tag extends Model
   {
    

    protected $guarded = [];

    public function posts()
    {
        return $this->morphedByMany(Post::class, 'taggable');
    }
   }

   

   

  $tag = Tag::firstOrCreate(
            ['tag_name' => 'traveling'],
        );
    
        $post = $tag->posts()->create([
            'body' => 'My new interesting post',
    
        ]);
 

Комментарии:

1. я использую тот же параметр для явного morphedByMany, но он возвращает неизвестный столбец. Unknown column 'tag_tag_id' in 'field list' (SQL: insert into media_tags` ( media_type , tag_id , tag_tag_id ) значения (3, 6, 1))` Ошибка return $this->morphedByMany(Post::class,'tagable', 'tagables', null, 'tag_id');

2. и проблема с этим способом, как ввести имя тега несколько раз? если 1 в порядке, допустим, есть 13 тегов. a,b,c,d,e,f,g,h и так далее, если логика сначала создает тег, а затем создает сообщение. это создаст сообщение mutlti.

3. $tag1 = Тег::firstOrCreate( [‘имя’ => ‘tag1’], ); $tag2 = Тег::firstOrCreate( [‘имя’ =>> ‘tag2’], ); $post = Сообщение::создать([ ‘имя’ =>>> ‘имя тега1’, ]); $insertData = [ [‘tag_id’ =>>>> $tag1->>>>идентификатор, ‘taggable_id’ = > > > > > > $post- > >>>>>>идентификатор, ‘taggable_type’ =>>>>>>>> Сообщение::класс], [‘tag_id’ =>>>>>>>>> $tag2->>>>>>>>>>идентификатор, ‘taggable_id’ =>>>>>>>>>>> $сообщение->>>>>>>>>>>>идентификатор, ‘taggable_type’ =>>>>>>>>>>>>> Сообщение::класс], ]; Помечается::вставка($insertData);

4. Я тоже так думаю, использую junction в качестве модели. но это приведет к пробуждению образцовыми способами. используйте соединение в качестве модели. Я лучше использую класс DB, чтобы прояснить, что такое модель.