Php 通过无脂肪框架SQL数据映射器进行BYTEA检索

Php 通过无脂肪框架SQL数据映射器进行BYTEA检索,php,postgresql,pdo,orm,fat-free-framework,Php,Postgresql,Pdo,Orm,Fat Free Framework,我正在尝试使用无脂肪框架中的\DB\SQL\Mapper从PostgreSQL数据库检索存储的二进制数据(bytea) 然而,由于某些原因,除了“资源ID”字符串之外,我似乎无法获取任何内容。比如说 // Establish database communication $this->db = new \DB\SQL( $f3->get("database.type") . ":host=" . $f3->get("databas

我正在尝试使用无脂肪框架中的
\DB\SQL\Mapper
从PostgreSQL数据库检索存储的二进制数据(
bytea

然而,由于某些原因,除了“资源ID”字符串之外,我似乎无法获取任何内容。比如说

    // Establish database communication
    $this->db = new \DB\SQL(
        $f3->get("database.type") .
        ":host=" . $f3->get("database.host") .
        ";port=" . $f3->get("database.port") .
        ";dbname=" . $f3->get("database.name"),
        $f3->get("database.user"),
        $f3->get("database.password"),
        array(
            \PDO::ATTR_PERSISTENT => TRUE,
            \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
        )
    );

    // Firmware Object-Relational-Mapper
    $this->firmware = new \DB\SQL\Mapper(
        $this->db,
        "firmware"
    );

    // Selection parameters 
    $this->select = array(
          "id=:id",
          ":id" => array(
              $f3->get("PARAMS.id"),
              \PDO::PARAM_INT
          )
    );

    // Map to record
    $this->firmware->load($this->select);

    // Error: expects parameter 1 to be resource, string given
    // $this->firmware->binary is "Resource id #23"
    fpassthru($this->firmware->binary); 
但是,如果我对
\DB\SQL
PDO类执行一条准备好的语句,我可以毫无疑问地检索二进制数据。i、 e

    $record = $this->db->exec(
        'SELECT "binary" FROM "firmware" WHERE id=?',
         $f3->get("PARAMS.id")
    );

    fpassthru($record[0]['binary']); //spits out the binary data

所以我的问题是,;是否有一种方法可以从表中检索二进制数据,同时仍在无脂模式下使用ORM

我认为这是因为应用了类型转换。 ORM可能无法为PostgreSQL中的二进制字段找到正确的pdo类型

您可以尝试如下方式覆盖它:

$this->firmware = new \DB\SQL\Mapper(
   $this->db,
   "firmware"
);       
$schema = $this->firmware->schema();
$schema['binary']['pdo_type'] = \PDO::PARAM_LOB;
$this->firmware->schema($schema);

可能您还需要调整并添加默认的case,它只返回进入的内容,因此值通过
return$val

传递得非常好,覆盖了模式并向开关添加了一个case。虽然我添加了
case\PDO::PARAM_LOB:return$val只是为了添加,我也修改了<代码>大小写“bytea”:返回\PDO::PARAM_LOB