laravel数据库模型蛇形命名自动转换驼峰命名

文章介绍了如何在Laravel项目中通过安装和配置eloquence库,实现模型属性在数据库交互时的驼峰命名与蛇形命名自动转换,包括保存数据、返回数据时的转换,并提供了联表查询和自定义属性处理的例子。同时,指出了该方法在复杂SQL操作时的局限性。
摘要由CSDN通过智能技术生成

2023年6月20日15:10:59

我看了各种方案,但是多多少少都有各种问题
建议使用 GitHub - kirkbushell/eloquence: A drop-in library for certain database functionality in Laravel, that allows for extra features that may never make it into the main project.

安装

composer require kirkbushell/eloquence

添加到 provider

添加 eloquence service provider 在你的 config/app.php 文件中

'providers' => [

        /*
         * Application Service Providers...
         */
        Eloquence\EloquenceServiceProvider::class,
    ],

使用方法

在模型添加 use \Eloquence\Behaviours\CamelCasing;

<?php
namespace App\Models;

use Eloquence\Behaviours\CamelCasing;
use Illuminate\Database\Eloquent\Model;

class Feedback
{
    use CamelCasing;

    protected $table = 'feedback';
    protected $primaryKey = 'id';
    protected $guarded = [];
    public $timestamps = false;
}

以下是注意的几点:

1,add save的时候你的模型的对象属性是蛇形命名还是驼峰命名都是可以,因为在包里调用的

Str::snake($key)方法,如果是蛇形命名就不会改变,是驼峰就会转换成蛇形,例如:

isset($where['nickName']) && $feedback->nickName = $where['nickName'];
$res = $feedback->save();

数据库的字段是:nick_name

2,返回数据的时候,会自动驼峰转换

{
	"code": 200,
	"msg": "操作成功",
	"data": {
		"count": 2,
		"list": [
			{
			"id": 13,
			"nickName": "33333",
			"contact": "11111",
			"content": "2222",
			"createAt": "2023-06-21 09:58:23",
			"updateAt": "2023-06-21 09:58:23",
			"platform": "PC",
			"lang": "zh-CN"
			}
		]
	}
}

数据库的结构:
CREATE TABLE `feedback` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '反馈昵称',
 `contact` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系方式',
 `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '反馈内容',
 `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
 `update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
 `platform` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'PC' COMMENT '平台类型',
 `lang` varchar(10) COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'zh-CN' COMMENT '语言类型',
 PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='反馈表';

3,联表测试返回的数据

$banner = Banner::with(['admin_zx']);


class Banner extends Model
{

    use CamelCasing;

    protected $table = 'banner';
    protected $primaryKey = 'id';
    protected $guarded = [];

    public $timestamps = false;

    public function admin_zx()
    {
        return $this->hasOne(Admin::class, 'id', 'admin_id');
    }
}

返回数据:

{
	"id": 37,
	"name": "百亿",
	"adminId": 5,
	"url": "l",
	"sort": 11,
	"startTime": null,
	"endTime": null,
	"createAt": "2022-01-21 15:50:50",
	"updateAt": "2022-01-23 22:52:56",
	"picPath": "/upload/image/20190322/57da8821d96f8391b084757a8d41e072.jpg",
	"videoPath": null,
	"platform": "10",
	"lang": "zh-CN",
	"adminZx": {
		"id": 5,
		"name": "admin",
		"password": "c3284d0f9",
		"salt": "",
		"sex": 3,
		"email": "",
		"mobile": "",
		"loginIp": "",
		"status": 1,
		"avatar": null,
		"realName": "admin",
		"loginTime": "2023-03-21 08:31:03",
		"adminGroupIds": "9",
		"isAdmin": 1,
		"sort": 255,
		"createAt": "2022-01-21 15:45:09",
		"updateAt": "2023-03-21 08:31:03"
	}
},

4,使用属性自定义处理,不会影响返回nick_name转化成驼峰

class Feedback extends Model
{
    use CamelCasing;

    protected $table = 'feedback';
    protected $primaryKey = 'id';
    protected $guarded = [];

    public $timestamps = false;


    public function getNickNameAttribute($value)
    {
        return !empty($value) ? json_decode($value, true) : '';
    }

    public function setNickNameAttribute($value)
    {
        $this->attributes['nick_name'] = !empty($value) ? json_encode($value) : '';
    }
}

5,一些基础问题说明

1,为什么要用驼峰命名数据库,这个主要是个人习惯,但是类名,方法名,变量名laravel中大多数是驼峰
2,全部使用蛇形命名有什么问题吗?答:没问题
3,全部使用驼峰命名有什么问题吗?答:没问题
4,为什么要有这个命名转化为驼峰命名的插件呢?其实为了代码风格统一,方便开发习惯


缺点
 


Admin::where('name', 'admin')->update(['token' => $toked, 'tokenTime' => date('Y-m-d H:i:s', time())]);

sql:
update `admin` set `token` = bd1066d7181192f555431503c3a04086, `tokenTime` = 2023-06-25 09:00:26 where `name` = admin

这样操作会出现`update`等操作数组,`复杂SQL`,`原生SQL`都不会激活自动转换驼峰,蛇形转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值