#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, чтобы прояснить, что такое модель.