easyswoole icon indicating copy to clipboard operation
easyswoole copied to clipboard

ORM 功能建议

Open SemiThin opened this issue 3 years ago • 1 comments

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

[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 * FROM users WHERE (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 * FROM think_userWHERE (nameLIKE 'thinkphp%' ANDtitleLIKE '%thinkphp' ) OR (nameLIKE 'kancloud%' ANDtitle LIKE '%kancloud' )

SemiThin avatar Apr 22 '21 08:04 SemiThin

好的。感谢反馈

kiss291323003 avatar May 31 '21 15:05 kiss291323003