easy-swoole / easyswoole

swoole,easyswoole,swoole framework
https://www.easyswoole.com/
Apache License 2.0
4.74k stars 510 forks source link

ORM 功能建议 #477

Open SemiThin opened 3 years ago

SemiThin commented 3 years ago

一、 关联模型一对多 没有限制返回关联数据数量的功能。

[Thinkphp6] 对于一对多关联来说,如果需要设置返回的关联数据数量,可以使用withLimit方法。

Article::with(['comments' => function(Relation $query) {
    $query->order('create_time', 'desc')->withLimit(3);
}])->select();

二、 ORM whereOr 复杂查询功能

$where = [
    'name' => ['%小明%', 'LIKE'],
    'company' => ['%科技有限公司%', 'LIKE','OR']
];

UsersModel::create()->where($where)->all();

这样简单的OR查询还能应付

当我的需求是这样子的

SELECT * FROMusersWHERE (name LIKE'%小明%' AND company LIKE '%科技有限公司%' ) OR (name LIKE'%小红%' AND company LIKE '%股份有限公司%')

最后我是这么完成的,但是觉得极其丑陋

$where = " (name LIKE'%小明%' AND company LIKE '%科技有限公司%' )  OR  (name LIKE'%小红%' AND company LIKE '%股份有限公司%' )"

UsersModel::create()->where($where)->all();

以下是TP手册提供的ORM ,希望官方ORM也加一个这样子的 whereOr 方法

$map1 = [
        ['name', 'like', 'thinkphp%'],
        ['title', 'like', '%thinkphp'],
    ];

$map2 = [
        ['name', 'like', 'kancloud%'],
        ['title', 'like', '%kancloud'],
    ];    

Db::table('think_user')
    ->whereOr([ $map1, $map2 ])
    ->select();

最后生成的sql SELECT * FROMthink_userWHERE (nameLIKE 'thinkphp%' ANDtitleLIKE '%thinkphp' ) OR (nameLIKE 'kancloud%' ANDtitleLIKE '%kancloud' )

kiss291323003 commented 3 years ago

好的。感谢反馈