Получить записи, кроме программно удаленных, из всех связанных таблиц- Laravel

#php #laravel

Вопрос:

Я использую Laravel 8. Здесь у меня есть две таблицы category , post которые связаны друг с другом, и обе включают softdelete в себя .

Когда я удаляю запись из таблицы категорий и пытаюсь выполнить поиск записи, используя любые ключевые слова, и если эти ключевые слова найдены в таблице записей, но их категория удалена, возникает ошибка.

Я пишу код, как показано ниже. А также попробуйте по-другому, но безуспешно.

Использование кода для поиска:

 $posts = Post::with(['category:id,name,slug'])
    ->where('title', 'LIKE', "%{$keywords}%")
    ->orWhere('keywords', 'LIKE', "%{$keywords}%")
    ->get();
 

Из этого кода я получаю запись записи, которая относится к категории, которая является softdeleted, поэтому она возвращает нулевую категорию и вызывает ошибку, отсутствующую в категории параметров. Но как я могу изменить приведенный выше код, чтобы он не возвращал сообщение о том, какая категория является softdeleted.

Модель: Post.php

 public function category()
{
    return $this->belongsTo(Category::class, 'category_id', 'id');
}
 

Модель: Category.php

 public function posts()
{
    return $this->hasMany(AppModelsPost::class, 'category_id');
}
 

Маршрут:

 Route::get('/{category:slug}/{pSlug}/{id}', [MasterPostController::class, 'showPost'])->name('post.detail');
 

Ошибка:

 Missing required parameter for [Route: post.detail] [URI: {category}/{pSlug}/{id}] [Missing parameter: category]. (View: L:Linksgetalowresourcesviewssearch-post.blade.php)
 

Я также использую ->has('category') , но не работаю

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

1. Ошибка указывает на то, что вы вызываете post.detail маршрут (возможно, при загрузке представления) без передачи требуемого category параметра. Включение сообщений, относящихся к удаленной категории, — это, в некотором смысле, совсем другая история.

2. Да, и у меня есть модель категории в маршруте, но это происходит потому, что я получаю запись из вышеприведенного кода с нулевой категорией, я не хочу получать записи, которые не являются программно удаленными из связанной таблицы.

Ответ №1:

Да, в этом случае вы получите категорию как null, и когда она будет передана по маршруту, вы получите эту ошибку. Поэтому, чтобы решить эту проблему, вам нужно отфильтровать свой пост после его получения, вы можете сделать это двумя способами.

Способ 1:

После получения сообщения, находясь в цикле, проверьте, является ли категория нулевой -> опустите эти данные.

Способ 2:

Улучшайте свой код с помощью whereNotNull(«категория»). Ниже приведен код

 $posts = Post::with(['category:id,name,slug'])
        ->where('title', 'LIKE', "%{$keywords}%")
        ->orWhere('keywords', 'LIKE', "%{$keywords}%")
        ->get()->whereNotNull('category');