ThinkPHP中获取器中定义数据表中不存在的虚拟字段

发布时间:2024-01-26浏览次数:249 次
在ThinkPHP的获取器中定义数据表中不存在的字段在开发中非常常见,但是,只有数据表中的字段会被默认触发和添加,如果定义的获取器是数据表中不存在的字段的话,就

在ThinkPHP的获取器中定义数据表中不存在的字段在开发中非常常见,但是,只有数据表中的字段会被默认触发和添加,如果定义的获取器是数据表中不存在的字段的话,就需要手动去触发。如我们数据库中使用的是 status字段,表示数据状态,但是在获取器中,我们定义了getPackStatusAttr方法,用来根据status字段的值,转为文字描述形式的状态字段。

官方文档为我们提供了如下说明:

$data = Pack::where('id',1)->find();

echo $data->pack_status; // 可以正常打印

echo $data->getAttr('pack_status'); // 可以正常打印
print_r($data->toArray()); // 使用这种方式打印出的数据中,不包含 pack_status 字段

在数据集中:

$data = Pack::where('id','>',0)->select();
print_r($data->toArray());// 打印出的数据中不包含pack_status字段
使用foreach循环打印
foreach ($data as $item){
    print_r($item->pack_status); // 可以正常打印
    print_r($item->toArray());// 打印出的数据中不包含pack_status字段
    echo "<hr />";
}

综上,可见在打印常规的select或者find之后的数据时,默认并不会包含pack_status字段,如果希望默认打印出的字段中,就存在我们定义了获取器的字段的话,需要我们手动去指定,指定的方式有两种:

一、使用append()方法:

虽然一直都在使用这个方法,但在查看文档时,发现只在关联输出等章节介绍了append方法,在获取器一节则未提及。印象中一定是在ThinkPHP之前的某个版本的文档中见过,仔细搜索一番,在《ThinkPHP6.0入门必读》文档中找到了对于append方法的描述:

代码如下:

$data = Pack::where('id','>',0)->append(['pack_status'])->find();
print_r($data->toArray()); // 打印出的数据中包含pack_status字段

此处,我们需要先留意一下,打印出的数据中,即包含了 pack_status字段也包含了status字段。

二、使用字段别名的方式

事实上有一种文档中未提及的,但是在使用时,更加简便的方式来携带自定义获取器的字段,就是使用字段别名的方式,当字段别名与我们定义的获取器中的字段名称一致时,会自动触发获取器。代码如下:

$data = Pack::where('id','>',0)->field('id,status as pack_status,create_time')->find();
print_r($data->toArray());

但是这个时候,就需要注意了,我们需要稍稍的修改下获取器中的定义方式,之前我们定义pack_status的代码如下

public function getPackStatusAttr($value, $data)
{
    $statusAry = [
        0 => "<span style='color: #ff5050'>待分解</span>",
        1 => "<span style='color: #ff9966'>待确认</span>",
        2 => "<span style='color: #3399ff'>已分解</span>",
    ];
    return key_exists($data['status'], $statusAry) ? $statusAry[$data['status']] : '--';
    // 上面的代码需要改为:
    return key_exists($value, $statusAry) ? $statusAry[$value] : '--';
}

即,我们是通过$data中的status来获取数据的,使用别名时,我们直接使用value参数即可。

如上是我们总结的,在获取器中定义了不在数据库中的字段时的两种方式,希望对大家有用。

扫一扫,在手机上查看