bestsource

PDO - FETCH_CLASS - 결과를 매개 변수로 생성자에게 전달

bestsource 2023. 10. 26. 21:17
반응형

PDO - FETCH_CLASS - 결과를 매개 변수로 생성자에게 전달

PDO의 결과를 컨스트럭터의 파라미터로 전달할 수 있는 방법이 있습니까?예를 들어, 저는 다음과 같은 수업을 듣습니다.

class Test
{
    private $value1;
    private $value2;
    function __construct($val1, $val2)
    {
        $this->value1 = $val1; $this->value2 = $val2;
    }
}

그런 다음, PDO 드라이버를 통해 DB에서 일부 데이터를 선택합니다.

SELECT price, quantity FROM stock

$results = $query->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "Test");

지금 PDO는 이 값을 클래스 필드에 직접 전달하고 생성자를 바이패스합니다.

제가 뭔가를 놓치고 있는 것 같지만, 질의 결과를 시공자에게 전달하고 싶습니다.생성자는 쿼리 종속형이 될 수 없습니다. PDO를 사용하지 않더라도 이 클래스를 인스턴스화할 수 있기를 원합니다.

FETCH_FUNC constant를 사용하고 컨스트럭터를 통해 객체를 생성할 수 있는 기능을 제공하는 것이 제가 찾은 유일한 방법이었습니다.

function rowMapper( $price, $quantity)
{
  return new Test( $price, $quantity);
}
$results = $query->fetchAll( PDO::FETCH_FUNC, "rowMapper");

이제 개체는 PDO가 개인 데이터에 값을 주입하고 캡슐화를 중단하는 대신 생성자를 사용하여만 생성됩니다.

제가 뭔가를 놓치고 있는 것 같지만, 질의 결과를 시공자에게 전달하고 싶습니다.

쿼리의 결과를 다음과 같이 직접 개체 속성에 할당할 수 있습니다.

또한 필요한 경우 PDO에서 값을 덮어쓸 수 있는 생성자가 필요하므로 제거합니다.PDO::FETCH_PROPS_LATE로부터fetch.

function __construct($val1=null, $val2=null) {

      // now the constructor is called after the fetch
      // if you pass values to it, they will be assigned

  if ($val1!==null) $this->price = $val1; 
  if ($val2!==null) $this->quantity = $val2;
}

우리는 그 물체를 인스턴스화하는 두 가지 방법이 있습니다.

PDO

$stmt = $db->prepare('SELECT price, quantity FROM stock');
$stmt->setFetchMode(PDO::FETCH_CLASS,'Test');
$result = $stmt->fetch();

신규

$result = new Test(25,100);

데이터베이스에서 가져온 값을 사용하여 작업하려면 생성자에서 작업할 수 있습니다. 여전히 남아 있습니다.FETCH_PROPS_LATE나가.

function __construct($val1=null, $val2=null) {
  if ($val1!==null) $this->price = $val1;
  if ($val2!==null) $this->quantity = $val2;
  $this->formattedPrice = number_format($this->price,'2');
}

개체에 대한 PDO Repository를 구축하는 중에 이러한 상황이 발생했습니다.파라미터를 1 대 1로 맞추는 것을 싫어하기 때문에 이 접근법을 사용하지 않습니다.이것은 정적인 공장 패턴을 사용함으로써 제가 건설자의 흉내를 낼 수 있는 가장 근접한 방법이었습니다.

class User
{
    private $id;
    public $name;
    public $isMinor;

    // make sure parameters are in the same order as the mysql result
    public static function buildFromPdo($id, $age, $name)
    {
        $user = new self;
        $user->id = $id;
        $user->name = $name;
        $user->isMinor = $age < 18;
        return $user;
    }

    public function getId()
    {
        return $this->id;
    }
}


$stmt = $db->prepare('SELECT id, age, name FROM users');
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_FUNC, "User::buildFromPdo");

"$result"는 User 개체의 배열이 됩니다.

[이전 답변이 더 이상 정확하지 않아 이 답변을 편집했습니다.]

FETCH_CLASS는 개인 속성으로 가져옵니다.이 답변을 참고해주시기 바랍니다.

당신의 경우 다음과 같이 전달할 수 있습니다.

$results = $query->fetchAll(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, "Test", array('val1', 'val1'));

다음에 대한 세 번째 매개 변수에 대해 읽어 보십시오.fetchAll() 여기에

PdObject::fetchAll(\PDO::FETCH_CLASS), 이렇게 하면 원하는 대로 정확하게 반환됩니다.

그럼에도 불구하고, 당신이 전달할 특정한 것이 필요하다면 아래의 코드 스니펫을 따르세요.

$sql = "SELECT * FROM ".$table. " WHERE id=$id";
$sth = $dbAdapter->prepare($sql);
$sth->execute();

//inject anything you want
$result = $sth->fetchAll(\PDO::FETCH_CLASS, $tableClass, array($pass1, $pass2, $dbAdapter));

언급URL : https://stackoverflow.com/questions/58106411/how-to-use-pdofetch-class-with-a-class-whose-constructor-takes-arguments

반응형