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
'bestsource' 카테고리의 다른 글
페이지 변경 청취자에서 페이지 설정 보기 더 이상 사용되지 않음 (0) | 2023.10.26 |
---|---|
jquery 특정 양식에서 모든 입력 받기 (0) | 2023.10.26 |
PIL을 사용하여 픽셀의 RGB 가져오기 (0) | 2023.10.26 |
mysql은 각 일에 대해 두 날짜/시간 사이의 초를 계산합니다. (0) | 2023.10.26 |
선택한 오라클 업데이트 쿼리 (0) | 2023.10.26 |