0

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

如果我喜欢

$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),它通过主键返回实体,它是否正确转义?

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

4

2 回答 2

4

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

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

与以下内容相同:

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

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

Products::findFirst([
    "id = ?0",
    "bind" => [$externalId]
]);
于 2012-12-27T18:23:59.337 回答
1

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

于 2014-01-12T01:25:18.427 回答