как добавить поле записи в ссылках на таблицу комментариев в таблице записей при автоматической вставке нового комментария - PullRequest
0 голосов
/ 26 апреля 2019

У меня проблема со ссылками на комментарий к таблице.Я хочу добавить сообщение пули из таблицы сообщений.

, поэтому, когда я вставляю комментарий, он может поместить commentable_slug из таблицы сообщений.Вот моя таблица комментариев и таблица сообщений.commentable_id = 32, это означает post_id, и вы можете увидеть слизня из поста, то есть (quia-pariatur-expedita-vel-quia)

таблица комментариев enter image description here

post table enter image description here

и моя миграция

Schema::create('comments', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->unsigned();
        $table->integer('parent_id')->unsigned()->nullable();
        $table->text('body');
        $table->integer('commentable_id')->unsigned();
        $table->foreign('commentable_id')->references('id')->on('posts')->onDelete('cascade');
        $table->string('commentable_slug')->nullable();
        $table->foreign('commentable_slug')->references('slug')->on('posts')->onDelete('cascade');
        $table->string('commentable_type');
        $table->timestamps();
    });

я использую null в commentable_slug, потому что он всегда предупреждает меня Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа терпит неудачу .

, когда я пытался, что мое поле, комментируемое , является нулевым .

моя модель комментария и отношение

 class Comment extends Model
{
    public function user()
    {
        return $this->belongsTo(Member::class);
    }
    public function post()
    {
        return $this->belongsTo(Post::class);
    }
    public function replies()
    {
        return $this->hasMany(Comment::class, 'parent_id');
    }
}

и модель моего поста

    class Post extends Model
    {
     public function user()
    {
        return $this->belongsTo(User::class);
    }
    public function comments()
        {
            return $this->morphMany(Comment::class, 'commentable')->whereNull('parent_id');
        }
    }

, где часть кода неверна?ожидаемый результат должен быть: enter image description here

как решить мою проблему?

1 Ответ

1 голос
/ 27 апреля 2019

Хорошо, я понимаю, что вы пытаетесь сделать. Проблема здесь

public function post()
{
    return $this->belongsTo(Post::class);
}

Поскольку это полиморфное отношение, вы не можете использовать стандарт belongsTo, поскольку у вас нет post_id в таблице.

Вам необходимо использовать функцию morphTo, подобную этой, в модели комментария

public function commentable()
{
    return $this->morphTo();
}

Так что, когда вы звоните

$comment->commentable()->get();

Затем он вернет любую полиморфную модель, с которой связан.

Немного сложно привести пример точного кода, поскольку вы еще не дали ни одного варианта использования.

Но, как сказано в комментариях, вам не нужно связывать id и слаг. Также я считаю, что у MySQL есть проблемы при использовании текстовых полей для ключей, и я думаю, что вам нужно указать длину поля, но не 100%, возможно, кто-то, кто знает больше о MySQL, мог бы подтвердить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...