thinkphp模型排序问题

1年前 4949次浏览

最近因项目需要在使用thinkphp框架,首先我肯定框架是个好框架,但是为什么官方文档非要把简单的名词非要写成他们自己才懂的内容呢?

tp模型用起来还觉得挺好用的,在使用过程中需要多次使用到order排序,在这里把我对TP模型的排序做个笔记。

首先我建了个模型A.php

<?php
namespace appconsolemodel;
use thinkModel;
class A extends Model
{
protected $table = 'table1';
protected $connection = 'data1';
protected $pk = 'Id';
}
tp单模型排序

这个是最基础的用法直接在控制器文件中调用该A模型,然后A::order('Id desc')->select();或者A::order('Id','desc')->select();相当于执行了下面的sql:

select * from table1 order by Id desc;

多个字段排序也大同小异与原生sql并没有多大区别:可以A:order('Id desc,time desc')->select();的方法,也可以使用A:order(['Id'=>'desc','time'=>'desc'])->select();

说明一下:排序以第一个字段为主,第二个参数一般情况并没有多少用处,只在通过第一个字段排序时如果第一个字段有重复现象时,才会再用第二个字段排序。这是sql的事不是tp的事。所以如果能确定排序字段唯一性的话还是少用多个字段排序。

tp模型关联排序

tp模型关联如果用好了真的挺好用的,但排序也很重要,这里我只是将我的用法写出来,并不代表所有的意志。

我再建一个模型B.php,假设表table2中的aid字段是与table1中的Id对应的。

image.png

<?php
namespace appconsolemodel;
use thinkModel;
class B extends Model
{
protected $table = 'table2';
protected $connection = 'data1';
protected $pk = 'Id';
}

那么需要将A模型与B模型关联,将A模型代码改为

<?php
namespace appconsolemodel;
use thinkModel;
class A extends Model
{
protected $table = 'table1';
protected $connection = 'data1';
protected $pk = 'Id';
public function sub()//设置sub为关联B模型
{
return $this->hasMany('B','aid');
}
}

这个时侯我们在控制器文件中使用A::with('sub')->order('Id','desc')->select();可以得到类似如下数据我将数据json化了:

[
    {
    "Id":2,
    "title":"湖南",
    "code":"0002",
    "sub":[
        {
            "Id":3,
            "title":"长沙",
            "aid":2,
            "code":"00020001"
        },
        {
            "Id":4,
            "title":"怀化",
            "aid":2,
            "code":"00020002"
        },
    ]
    },
    {
    "Id":1,
    "title":"北京",
    "code":"0001",
    "sub":[
        {
            "Id":1,
            "title":"东城区",
            "aid":1,
            "code":"00010001"
        },
        {
            "Id":2,
            "title":"西城区",
            "aid":1,
            "code":"00010002"
        }
    ]
    }
]

那么如何对关联的B数据进行排序呢?

方法一:直接在with里面定义排序参数:

A::with(['sub'=>function($query)
    {
        $query->order('code','desc');//设置B模型的排序方式
    }
])
->select();

方法二:在A模型中的sub中直接定义排序,如下:

<?php
namespace appconsolemodel;
use thinkModel;
class A extends Model
{
protected $table = 'table1';
protected $connection = 'data1';
protected $pk = 'Id';
public function sub()//设置sub为关联B模型
{
return $this->hasMany('B','aid')->order('code','desc');//在这里通过order进行排序
}
}

我用的方法一,因为方法二的排序是固定了的,不好操作。

结语:以上便是我用到的一些TPS模型排序方式,初接触TP。纯是当作笔记记录下来,以供以后再翻阅。