データベースアクセスをより簡単かつ効率的にするために、PHPでPDOを学習しています。どの方向でも大歓迎です。
つまり、PDOを使用して結果をカスタムオブジェクトに返す場合、クエリ結果キーに対応するメンバー変数を設定する必要があります。
といった:
class User
{
//Predefine Here
public $id;
public $username;
public $password;
public $email;
public $hash;
public function profileLink()
{
return sprintf('<a href="/profile/%s">%s</a>',$this->id,$this->username);
}
}
$result = $sth->fetchAll(PDO::FETCH_CLASS, "User");
foreach($result as $user)
{
echo $user->profileLink();
}
このようにして、PDOは変数を内部スコープ外のオブジェクトに設定できます。
あなたのユーザークラスがそうだった場合:
class User
{
}
プロパティが定義されていないため、PDOはスコープ外から値を設定できません。
このコードの断片があるとしましょう
<?php
class Foo {
public $bar;
public function __construct()
{
$this->bar = 1;
}
}
$stmt = $dbh->prepare("SELECT bar FROM foo");
$stmt->setFetchMode(PDO::FETCH_CLASS, 'Foo');
$stmt->execute();
$obj = $stmt->fetch()
?>
$ objのバープロパティは、データベースから取得されるものではなく、「1」に設定されます。
「1」ではなくデータベースからの結果に設定する場合は、フェッチモードを次のように変更できます。
$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'Foo');
これにより、プロパティに結果を割り当てる前にコンストラクターが呼び出されます
PDO :: FETCH_CLASSを振り返ると、変数をパブリックまたはプライベートとして定義する必要はありません(PHP 7.0)の場合、空のクラスとPHP PDOは、属性が定義されていない場合でも、属性を$ Class-> attributeとして設定します。
同じテーブルを扱うが異なる列を返す可能性のある複数のクエリでクラスを再利用できるため、これは非常に便利です。
使用する代わりに:FetchAll(PDO::FETCH_CLASS, 'classname')
使用できます:fetchObject('classname')
例:
class Car extends DatabaseTable {
const TABLE_NAME = 'cars';
// Table Columns
private $color;
private $brand;
private $type;
public function __construct($pdo, $id = false)
{
parent::__construct($pdo, TABLE_NAME, $id);
}
public static function getAll($pdo, $order = 'id') {
$query = 'SELECT * FROM ' . self::TABLE_NAME . '
ORDER BY ' . $order;
$statement = $pdo->prepare($query);
$objects = [];
while ($obj = $statement->fetchObject(self::class, [$pdo])) {
$objects[$obj->getId()] = $obj;
}
return $objects;
}
親Constructorは、次のような3つのプロパティを設定するだけです:$this->id = $id;