laravel中在model里面重写where怎么写?

我在 laravel 中使用 mongodb 作为 db 驱动,每次查找数据 都是 where ([“_id”=>1]) 使用_id ,我想兼容一下 都换成 where ([“id”=>1]) 用 id 作为查询条件,想着能不能重写 where 然后当查询 id 的时候换成查询_id , 不知道怎么用?有大佬知道的吗?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 12

没有的,你只是兼容处理主键的话whereKey更好用

1年前 评论
test2018 (楼主) 1年前
test2018

这样写确实可以实现效果 但是不知道有没有隐患

public function where($column){
        if(isset($column['id'])) {
            $column['_id'] = $column['id'];
            unset($column['id']);
        }
        return static::query()->where($column);
}



1年前 评论
relax_tortoise 1年前
relax_tortoise 1年前
gongmeng 1年前

使用局部作用域:快速入门《Laravel 9 中文文档》 可达到这个需求

public function scopeMongodbId($query, $id, $operator = "=")
{
    return $query->where('_id', $operator, $id);
}

$users = User::mongodbId($id, ">")->get();
1年前

没有用 mongodb 的 ORM 吗

1年前

全局作用域(软删除就是这么实现的)
快速入门《Laravel 6 中文文档》

1年前

光就这一点,实数没必要

1年前
//AppServiceProvider里面注册一个宏
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
...
Builder::macro('whereMongodbId', function ($id,$op = '=',$key = '_id') {
    $this->where($key,$op,$id);
    return $this;
 });
EloquentBuilder::macro('whereMongodbId', function ($id,$op = '=',$key = '_id') {
    $this->getQuery()->where($key,$op,$id);
    return $this;
});
//使用
DB::name('some_table')->whereMongodbId(123)->first();
AModel::whereMongodbId(123)->first();

//或者激进点
Builder::macro('IdEq', function ($id) {
    $this->where('_id','=',$id);
    return $this;
});
Builder::macro('IdLt', function ($id) {
    $this->where('_id','<',$id);
    return $this;
});
Builder::macro('IdGt', function ($id) {
    $this->where('_id','>',$id);
    return $this;
});
1年前
nff93

这个 ORM 不会自动处理嘛?

1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!