【问题标题】:CakePHP 3 Entity ConfusionCakePHP 3 实体混淆
【发布时间】:2015-02-19 10:21:34
【问题描述】:

这是我开始学习 CakePHP 3 以来一直面临的问题

这个实体的概念是什么,一个现实世界的例子会有很大帮助。

public function add()
{
            // why do we have to create new entity / what is the role of entity here. 
    $comment = $this->Comments->newEntity();

    if ($this->request->is('post','put')) {

                    // why do we have to use this line after posting / what is the role of this line. 

        $comment = $this->Comments->patchEntity($comment,$this->request->data);

        if ($this->Comments->save($comment)) {
            $this->Flash->success('comment submitted successfully.');
        } else {
            $this->Flash->error('Sorry, comment could not be updated.');
        }
    }

    return $this->redirect($this->referer());
}

【问题讨论】:

标签: cakephp cakephp-3.0


【解决方案1】:

让我为你打开the book

虽然表对象表示并提供对一组 对象,实体代表您的单个行或域对象 应用。实体包含持久的属性和方法 操纵和访问它们包含的数据。

-

我们为什么要创建新实体/实体在这里的作用是什么。

Cake3 中几乎所有的东西(如果不是全部)都与实体一起工作,实体的含义已在上面解释过。您需要创建一个新实体,以便 FormHelper 可以使用它,AFAIR 如果配置为也可以使用数组,但应该使用该实体。

实体存在的原因是为了抽象数据。有些人认为实体是数据库行的表示 - 这是错误的。正如书中所说,它们可以是一行,但不必代表一行,因为 3.0 ORM 也可以与其他资源一起使用。理论上,您可以拥有一个每行返回一个实体的 CSV 数据源。

我建议您阅读 CakePHP 核心中的实体代码,以更深入地了解实体提供的其他内容,只是说它们“只是”一组属性是短思想。

为什么发帖后一定要用这条线/这条线的作用是什么。

帖子数据被合并到之前创建的实体中,就是这样。如果您有类似的基本问题,请使用 API。 See the API entry for patchEntity().

【讨论】:

  • 虽然我同意您的回答,但最好不要说“这是错误的”,因为正如您自己所说,它可能是正确的。对于来自 RDB 的程序员来说,说这可能是正确的可能是帮助他们的更好方法。
【解决方案2】:

简单来说,Entity就是表的一条记录和它们的关系表的集合,在它上面你可以在不接触数据库的情况下进行操作,并根据需要封装实体的属性(表的字段)。

实体的优势。

  • 在数据库外修改结果集(用于格式化或其他)
  • 需要在同一个类中同时表示表和行。
  • 数据验证简直就是一场噩梦。
  • 在我们内部处理事物的方式以及返回的内容(以及如何)方面,API 不一致。
  • 你想要的其他随机的东西。

  • 您可以对结果集进行运行时修改。只需向您的实体添加一个方法,即可以您想要的方式返回结果。这也意味着您可以使用组合来管理实体(yaya 特征)

  • 验证很漂亮。我们可以在数据进入对象之前验证数据,然后在单独的步骤中验证对象状态。
  • 开发人员更容易理解他们正在处理的内容。您要么有一个对象,要么有一个对象数组。一个对象可以链接到可以包含其他对象的数据,但您不再需要猜测数组键是什么,也不必猜测它是否嵌套时髦。
  • 我们可以分别迭代表和实体的接口。由于对两者都有影响,我们无法轻易更改旧 Model 类的内部结构,而现在(理论上)我们可以(理论上)更改其中一个,而无需修改另一个。
  • 看起来更简单。

【讨论】:

    【解决方案3】:

    试试这个:

    if ($this->request->is('post','put')) {
     $data = $this->request->getData();
     $comment = $this->Comments->newEntity();
     $comment = $this->Comments->patchEntity($comment, $data);
     $status = $this->Comments->save($comment);
       if ($status) {
         $this->Flash->success('comment submitted successfully.');
       } else {
         $this->Flash->error('Sorry, comment could not be updated.');
       }
    }
    

    return $this->redirect($this->referer());

    }

    我的建议是永远不要在同一个函数中使用 Post 和 Put。只是为了好习惯。当您使用像参数一样的 id 进行更新时,Put 可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2021-12-14
      • 1970-01-01
      相关资源
      最近更新 更多