2016-03-22 5 views
0

PDO :: fetchAll()の現在のインスタンスでパラメータとして送信する別のインスタンスを作成することはできますか?PDO :: FETCH_CLASS引数

\ PDO :: FETCH_PROPS_LATEが設定されている場合は、まず__constructを呼び出し、そのプロパティをSECONDLYに設定します。配列を介して__constructに渡した値は上書きされます。 ただし、値を上書きすると、Voucherインスタンスが認識されません。


<?php 
class Voucher { 
    private $CD_ID, $CD_VOUCHER, $NR_EXPIRATION, $DT_VOUCHER, $IE_STATUS; 
    public function __construct($CD_ID, $CD_VOUCHER, $NR_EXPIRATION, $DT_VOUCHER, $IE_STATUS) { 
     $this->CD_ID = $CD_ID; 
     $this->CD_VOUCHER = $CD_VOUCHER; 
     $this->NR_EXPIRATION = $NR_EXPIRATION; 
     $this->DT_VOUCHER = $DT_VOUCHER; 
     $this->IE_STATUS = $IE_STATUS; 
    } 
} 
class Authentication { 
    private $CD_AUTH, $DT_AUTH, Voucher $CD_VOUCHER, $CD_IP, $CD_MAC, $CD_LOG; 
    public function __construct($CD_AUTH, $DT_AUTH, Voucher $CD_VOUCHER, $CD_IP, $CD_MAC, $CD_LOG) { 
     $this->CD_AUTH = $CD_AUTH; 
     $this->DT_AUTH = $DT_AUTH; 
     $this->CD_VOUCHER = $CD_VOUCHER; 
     $this->CD_IP = $CD_IP; 
     $this->CD_MAC = $CD_MAC; 
     $this->CD_LOG = $CD_LOG; 
    } 
} 
public function getAuthentications() { 
    try { 
     $sth = $this->db->prepare("SELECT `TB_AUTENTICACAO`.`CD_AUTH`, `TB_AUTENTICACAO`.`DT_AUTH`, `TB_VOUCHER`.`CD_ID`, `TB_VOUCHER`.`CD_VOUCHER`, `TB_VOUCHER`.`NR_EXPIRATION`, `TB_VOUCHER`.`DT_VOUCHER`, `TB_VOUCHER`.`IE_STATUS`, `TB_AUTENTICACAO`.`CD_IP`, `TB_AUTENTICACAO`.`CD_MAC`, `TB_AUTENTICACAO`.`CD_LOG` FROM `TB_AUTENTICACAO` INNER JOIN `TB_VOUCHER` ON `TB_VOUCHER`.`CD_ID` = `TB_AUTENTICACAO`.`CD_VOUCHER`;"); 
     $sth->execute(); 
     return $sth->fetchAll(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, "Models\\Authentication", array("TB_AUTENTICACAO.CD_AUTH", "TB_AUTENTICACAO.DT_AUTH", new \Models\Voucher("TB_VOUCHER.CD_ID", "TB_VOUCHER.CD_VOUCHER", "TB_VOUCHER.NR_EXPIRATION", "TB_VOUCHER.DT_VOUCHER", "TB_VOUCHER.IE_STATUS"), "TB_AUTENTICACAO.CD_IP", "TB_AUTENTICACAO.CD_MAC", "TB_AUTENTICACAO.CD_LOG")); 
     } catch (Exception $exc) { 
     die($exc->getMessage()); 
    } 
} 

結果でなければならない:例えば

Models\Authentication Object (
    [CD_AUTH:Models\Authentication:private] => 2 
    [DT_AUTH:Models\Authentication:private] => 2016-03-22 10:44:00 
    [CD_VOUCHER:Models\Authentication:private] => Models\Voucher Object (
      [CD_ID:Models\Voucher:private] => 1 
      [CD_VOUCHER:Models\Voucher:private] => xYgPB5 
      [NR_EXPIRATION:Models\Voucher:private] => 720 
      [DT_VOUCHER:Models\Voucher:private] => 2016-03-18 17:00:00 
      [IE_STATUS:Models\Voucher:private] => 0 
    ) 
    [CD_IP:Models\Authentication:private] => 10.10.10.10 
    [CD_MAC:Models\Authentication:private] => abc 
    [CD_LOG:Models\Authentication:private] => 1 
) 

が、私は得る:
例えば

Models\Authentication Object (
    [CD_AUTH:Models\Authentication:private] => 2 
    [DT_AUTH:Models\Authentication:private] => 2016-03-22 10:44:00 
    [CD_VOUCHER:Models\Authentication:private] => xYgPB5 
    [CD_IP:Models\Authentication:private] => 10.10.10.10 
    [CD_MAC:Models\Authentication:private] => abc 
    [CD_LOG:Models\Authentication:private] => 1 
    [CD_ID] => 1 
    [NR_EXPIRATION] => 720 
    [DT_VOUCHER] => 2016-03-18 17:00:00 
    [IE_STATUS] => 0 
) 

答えて

0

私は単純にして、変数をクラス自体のクラスとして定義します。しかし、私はあなたがこの問題をなぜ持っているのか分かりません。なぜなら、新しいクラスに変数を付けないからでしょうか?

PHP 5.6+を使用している場合は、可変長引数リストを使用できます。 あなたのコードを見て、私はそれが読み取り能力を向上させると思っていますが、欠点は、正しい数の変数がコンストラクタに解析されることを確認する必要があることです。

class Authentication { 
    private $CD_AUTH, $DT_AUTH, $CD_VOUCHER, $CD_IP, $CD_MAC, $CD_LOG; 
    public function __construct($CD_AUTH, $DT_AUTH, array $CD_VOUCHER, $CD_IP, $CD_MAC, $CD_LOG) { 
     ... 
     $this->CD_VOUCHER = new \Models\Voucher(...$CD_VOUCHER); 
     ... 
     # or go anonymous in php 7 
     $this->CD_VOUCHER = new class(...$CD_VOUCHER){ 
      function __construct($CD_ID, $CD_VOUCHER, $NR_EXPIRATION, $DT_VOUCHER, $IE_STATUS){ 
      ... 
      } 
     } 
    } 
} 

public function getAuthentications() { 
    try { 
     $sth = $this->db->prepare("..."); 
     $sth->execute(); 
     return $sth->fetchAll(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, "Models\\Authentication", array("TB_AUTENTICACAO.CD_AUTH", "TB_AUTENTICACAO.DT_AUTH", ["TB_VOUCHER.CD_ID", "TB_VOUCHER.CD_VOUCHER", "TB_VOUCHER.NR_EXPIRATION", "TB_VOUCHER.DT_VOUCHER", "TB_VOUCHER.IE_STATUS"], "TB_AUTENTICACAO.CD_IP", "TB_AUTENTICACAO.CD_MAC", "TB_AUTENTICACAO.CD_LOG")); 
     } catch (Exception $exc) { 
     die($exc->getMessage()); 
    } 
} 
+0

私は既にバウチャーのインスタンスを持っており、このバウチャーインスタンスで認証のインスタンスを作成します。 しかし、この場合、私はこのインスタンスの構築を「データベースからすべてのデータを同時に取得する」(認証とバウチャーのパラメータ)を「自動化」しようとしています。 したがって、このコンストラクトを引き続き使用する場合は、PDO :: fetchAll()でバウチャーをインスタンス化する認証のインスタンスを作成する方法はありませんか?フェッチされたすべてのデータから配列を作成し、手動ですべてのインスタンスを作成する必要がありますか? ありがとうございます! –