Laravel如何按name属性查询?findOrCreate方法查询异常问题
问题原因与解决办法
你忽略了一个关键:getRouteKeyName() 只负责路由模型绑定时的字段匹配,不会改变 find() 方法的默认行为——find() 永远默认按主键(通常是id)查询,和这个方法无关。
不需要新建自定义文件,直接修改findOrCreate的逻辑就能实现按名称查找:
方案1:直接用where查询
把find()替换成按name字段查询的逻辑,同时完善“查找或创建”的完整逻辑:
public static function findOrCreate(array $tags) { // 遍历所有传入的标签,逐个处理查找或创建 $result = []; foreach ($tags as $tagName) { // 按name查找,不存在则创建 $tag = Tag::where('name', $tagName)->first(); if (!$tag) { $tag = Tag::create(['name' => $tagName]); } $result[] = $tag; } // 返回所有处理后的标签集合,也可以根据需求返回单个 return collect($result); }
方案2:自定义封装查询方法(可选)
如果需要多次按名称查询,可以在模型里封装一个专用方法,让代码更整洁:
public static function findByName(string $name) { return self::where('name', $name)->first(); } // 在findOrCreate里调用自定义方法 public static function findOrCreate(array $tags) { $tag = self::findByName($tags[0]); if (!$tag) { $tag = self::create(['name' => $tags[0]]); } return $tag; }
补充说明
getRouteKeyName()的作用场景是路由自动解析,比如你定义了Route::get('/tags/{tag}', [TagController::class, 'show']),此时访问/tags/default,Laravel会自动用name字段查找对应的Tag模型,而不是id。但这个逻辑不会影响你在代码里直接调用find()的行为。
内容的提问来源于stack exchange,提问作者user13698713
相关产品推荐
相关产品推荐

