它是通过主键获取实体还是仅从具有指定数字的表中获取实体?
如果我喜欢
$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}},它应该通过主键返回实体,对吗?
答案 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