#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');