V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
894021573
V2EX  ›  PHP

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

  •  
  •   894021573 · 2018-10-31 17:19:41 +08:00 · 3166 次点击
    这是一个创建于 2217 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    7 条回复    2018-11-21 14:46:33 +08:00
    chnyang
        1
    chnyang  
       2018-10-31 19:50:54 +08:00
    show columns from table?
    doyouhaobaby
        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
    894021573
        3
    894021573  
    OP
       2018-11-02 18:13:40 +08:00
    @doyouhaobaby 我们的观点比较一致。还想听听其他伙伴的看法。
    894021573
        4
    894021573  
    OP
       2018-11-02 18:16:36 +08:00
    @chnyang 对啊,框架做了。
    hefish
        5
    hefish  
       2018-11-11 11:32:02 +08:00
    我还是不适应 tp,小项目还是自己用 composer 搭个架子,自己写一个简单的 controller 路由。 操作数据库,感觉还是 eloquent 顺手一些。
    Joyboo
        6
    Joyboo  
       2018-11-19 16:40:32 +08:00
    @hefish tp5 的模型类,很强大的
    xiaoxiaoan317
        7
    xiaoxiaoan317  
       2018-11-21 14:46:33 +08:00
    推荐 tp5 吧,比 tp3 好多了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3365 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:42 · PVG 08:42 · LAX 16:42 · JFK 19:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.