以 thinkphp3 为例,非 debug 模式。 假如把 a1,a2,a3 字段插入表 A。后来表 A 新增 a4 字段,然后把 a1,a2,a3,a4 字段插入表 A。 因为表 A 事先只缓存了 a1,a2,a3 三个字段,所以会自动过滤 a4。只能清除表缓存来解决。
Yii2 也有类似的设计。Yii2 中,自动生成模型那里,会用到表字段信息,因为有字段验证规则,其他地方,貌似也没需要用到表字段的地方了。
总结:因为表结构缓存踩了几次坑,对一些新增的字段,修改无效(不如直接数据库报错来的好)。而增删改查其实不需要知道表结构。所以请教下,这表结构缓存主要是用来做啥的?
1
chnyang 2018-10-31 19:50:54 +08:00
show columns from table?
|
2
doyouhaobaby 2018-11-01 11:13:47 +08:00 1
这种设计有缺陷,很容易采坑的,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 <[email protected]> * * @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 |
3
894021573 OP @doyouhaobaby 我们的观点比较一致。还想听听其他伙伴的看法。
|
5
hefish 2018-11-11 11:32:02 +08:00
我还是不适应 tp,小项目还是自己用 composer 搭个架子,自己写一个简单的 controller 路由。 操作数据库,感觉还是 eloquent 顺手一些。
|
7
xiaoxiaoan317 2018-11-21 14:46:33 +08:00
推荐 tp5 吧,比 tp3 好多了
|