You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:15:42