【问题标题】:What does Phalcon\Mvc\Model::findFirst((int) $id)?Phalcon\Mvc\Model::findFirst((int) $id) 是什么?
【发布时间】:2012-12-26 20:46:23
【问题描述】:

它是通过主键获取实体..还是仅从具有指定编号的表中获取实体?

如果我这样做

$model = new Phalcon\Mvc\Model();
$model->findFirst('id = 1');

很清楚。但如果我定义

$model->findFirst(1);

它应该返回什么?主键=“1”的实体还是表中的第一个实体?我问是因为我在团队的代码方法中发现了这样的

class BaseModel extends \Phalcon\Mvc\Model
{
     public function getById($id) { /* ... */ }
}

我不确定我们是否真的需要它们。

第二个问题——如果我们执行 findFirst($int) 时,它通过主键返回实体,它是否正确转义?

附:根据https://github.com/phalcon/cphalcon/issues/265,它应该通过主键返回实体,对吧?

【问题讨论】:

  • 你能实例化 Phalcon\Mvc\Model 吗?
  • 我写了 new Phalcon\Mvc\Model() 作为例子,我总是使用带有定义方法 getSource() 等的扩展类,如果这是你的问题:)

标签: model phalcon


【解决方案1】:

如果您只将一个整数传递给 findFirst 方法,它将检查映射模型是否只有一个主键字段,然后它将执行如下查询:

Products::findFirst(1); //SELECT * FROM products WHERE id = 1

什么是相同的:

Products::findFirst("id = 1");

(int) 参数仅在第一个参数是整数有效值时才有效,使用外部数据执行此操作的安全方法是:

Products::findFirst([
    "id = ?0",
    "bind" => [$externalId]
]);

【讨论】:

    【解决方案2】:

    findFirst(55) 将返回主键的第一个找到的字段等于 55 的第一条记录。 虽然我认为这不是一个好主意,但是当您有 2 个或更多字段作为主键时可以使用它,因为它会将 LIMIT 1 添加到实际查询中,而使用 find(55) 不会。

    与我曾经相信的相反,它不使用主键索引顺序来“选择” 要使用的第一个字段。它使用在表中找到字段的顺序。

    所以如果你有一张桌子:

    CREATE TABLE `T` (
        `A` TINYINT(1) NOT NULL,
        `B` VARCHAR(50) NOT NULL,
        PRIMARY KEY (`A`, `B`)
    );
    

    findFirst(66) 将产生这个查询:

    SELECT ... WHERE `T`.`B` = 66 LIMIT 1
    

    如果您想确认,请使用事件管理器记录确切的查询。 (http://docs.phalconphp.com/en/latest/reference/events.html#usage-example)

    findFirst($var) 也不会转义 $var,所以如果 $var = "55 OR 1=1" 实际查询将是: SELECT (...) WHERE 55 OR 1 = 1 LIMIT 1

    【讨论】:

      猜你喜欢
      • 2012-12-05
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-10
      相关资源
      最近更新 更多