为什么一些 PHP 框架,比如 thinkphp3 都有表结构缓存功能

2018-10-31 17:19:41 +08:00
 894021573

以 thinkphp3 为例,非 debug 模式。 假如把 a1,a2,a3 字段插入表 A。后来表 A 新增 a4 字段,然后把 a1,a2,a3,a4 字段插入表 A。 因为表 A 事先只缓存了 a1,a2,a3 三个字段,所以会自动过滤 a4。只能清除表缓存来解决。

Yii2 也有类似的设计。Yii2 中,自动生成模型那里,会用到表字段信息,因为有字段验证规则,其他地方,貌似也没需要用到表字段的地方了。

总结:因为表结构缓存踩了几次坑,对一些新增的字段,修改无效(不如直接数据库报错来的好)。而增删改查其实不需要知道表结构。所以请教下,这表结构缓存主要是用来做啥的?

3187 次点击
所在节点    PHP
7 条回复
chnyang
2018-10-31 19:50:54 +08:00
show columns from table?
doyouhaobaby
2018-11-01 11:13:47 +08:00
这种设计有缺陷,很容易采坑的,TP3 在公司中用的时候自动过滤,比如字段单词拼写错误造成了很多隐晦的 bug,代码太依赖数据库了,我现在基本放弃这种写法了。把字段放到 model 层或者实体,用 getter setter 来做比较好,字段校验不依赖数据库。

```
<?php

declare(strict_types=1);

/*
* This file is part of the ************************ package.
* _____________ _______________
* ______/ \__ _____ ____ ______ / /_ _________
* ____/ __ / / / / _ \/ __`\/ / __ \/ __ \/ __ \___
* __/ / / / /_/ / __/ / \ / /_/ / / / / /_/ /__
* \_\ \_/\____/\___/_/ / / .___/_/ /_/ .___/
* \_\ /_/_/ /_/
*
* The PHP Framework For Code Poem As Free As Wind. <Query Yet Simple>
* (c) 2010-2018 http://queryphp.com All rights reserved.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Tests\Database\Ddd\Entity\Relation;

use Leevel\Database\Ddd\Entity;

/**
* post.
*
* @author Xiangmin Liu <635750556@qq.com>
*
* @since 2018.10.13
*
* @version 1.0
*/
class Post extends Entity
{
const TABLE = 'post';

const ID = 'id';

const AUTO = 'id';

const STRUCT = [
'id' => [
'readonly' => true,
],
'title' => [],
'user_id' => [],
'summary' => [],
'create_at' => [],
'delete_at' => [],
'user' => [
self::BELONGS_TO => User::class,
'source_key' => 'user_id',
'target_key' => 'id',
],
'comment' => [
self::HAS_MANY => Comment::class,
'source_key' => 'id',
'target_key' => 'post_id',
self::SCOPE => 'comment',
],
'post_content' => [
self::HAS_ONE => PostContent::class,
'source_key' => 'id',
'target_key' => 'post_id',
],
];

const DELETE_AT = 'delete_at';

private $id;

private $title;

private $userId;

private $summary;

private $createAt;

private $deleteAt;

private $user;

private $comment;

private $postContent;

public function setter(string $prop, $value)
{
$this->{$this->prop($prop)} = $value;

return $this;
}

public function getter(string $prop)
{
return $this->{$this->prop($prop)};
}

public function scopeComment($select)
{
$select->where('id', '>', 4);
}

public function scopeTest($select)
{
$select->where('id', '>', 4);
}

public function scopeTest2($select)
{
$select->where('id', '<', 10);
}

public function scopeTest3($select)
{
$select->where('id', 5);
}
}
```

https://github.com/hunzhiwange/framework/blob/master/tests/Database/Ddd/Entity/Relation/Post.php
894021573
2018-11-02 18:13:40 +08:00
@doyouhaobaby 我们的观点比较一致。还想听听其他伙伴的看法。
894021573
2018-11-02 18:16:36 +08:00
@chnyang 对啊,框架做了。
hefish
2018-11-11 11:32:02 +08:00
我还是不适应 tp,小项目还是自己用 composer 搭个架子,自己写一个简单的 controller 路由。 操作数据库,感觉还是 eloquent 顺手一些。
Joyboo
2018-11-19 16:40:32 +08:00
@hefish tp5 的模型类,很强大的
xiaoxiaoan317
2018-11-21 14:46:33 +08:00
推荐 tp5 吧,比 tp3 好多了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/503098

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX