Phalcon \ Mvc \ Model :: findFirst((int)$ id)是什么?

时间:2012-12-26 20:46:24

标签: model phalcon

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

如果我喜欢

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

P.S。根据{{​​3}},它应该通过主键返回实体,对吗?

2 个答案:

答案 0 :(得分:4)

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

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

与...相同:

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

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

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

答案 1 :(得分:1)

findFirst(55)将返回第一条记录,其中主键的第一个找到的字段等于55。 虽然我不认为它是一个好的ideea,但是当你有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