Laravel中Category::find()返回null但数据库存在对应记录如何修复
问题原因
- Category模型启用了
SoftDeletes软删除特性,find()方法默认会过滤deleted_at字段不为空的记录,就算数据库物理存储了对应ID的记录,只要被标记为软删除就会返回null,这是最常见的诱因。 - 你后续执行的
Category::where('cat_id', 25)只返回了查询构造器对象,没有调用first()/get()执行查询,不能证明对应数据可被正常查询到。 - 小概率原因是项目配置的数据库和你查看数据的数据库不是同一个,或者表前缀配置不匹配,导致查询的表不对。
修复步骤
- 先验证是否为软删除导致的问题,执行以下调试代码:
dd( Category::withTrashed()->find(25), Category::withTrashed()->find(24), Category::withTrashed()->find(23), Category::withTrashed()->find(22) );
- 如果上述代码能返回正常的分类对象,说明数据确实被软删除了: - 属于误删的话,执行`Category::withTrashed()->find(对应ID)->restore()`恢复对应分类即可 - 如果业务需要查询已软删除的分类,把原有代码里的`Category::find()`替换为`Category::withTrashed()->find()`即可 - 如果上述代码仍然返回null,检查项目`.env`和`config/database.php`里的数据库配置,确认连接的数据库、表前缀和你实际查看的数据库一致。
- 优化代码避免同类报错:后续调用模型属性前先判断对象是否存在,防止空对象报错:
public function index() { $args = []; $args = array_merge($args, $this->data_creator(35, 12, 'book')); $args = array_merge($args, $this->data_creator(37, 12, 'kit')); $args = array_merge($args, $this->data_creator(38, 12, 'game')); $args['menu_links'] = [ 'books' => ($cat = Category::find(25)) ? route('shopping-products.category', $cat->slug) : '#', 'videos' => ($cat = Category::find(24)) ? route('shopping-products.category', $cat->slug) : '#', 'kits' => ($cat = Category::find(23)) ? route('shopping-products.category', $cat->slug) : '#', 'games' => ($cat = Category::find(22)) ? route('shopping-products.category', $cat->slug) : '#', ]; return view('frontend.shop.products.index', $args); }
内容的提问来源于stack exchange,提问作者user9277271
相关产品推荐
相关产品推荐

