編輯對象的數組:輸出代碼AT BOTTOM問題創建數據映射器模式
我剛剛發佈了一個問題,思考我的問題是查詢,但事實證明,這是我的PHP代碼。
這是問題所在。我有一個GoalChallenge類,它有許多屬性,其中一個屬性應該是一個,或者是一個ProductService對象數組;請參閱下面的GoalChallenge類(注意我已經剝離了其他getter和setter,並且留下了與ProductService類有關的那些類
當我使用GoalChallenge :: findByPersonaId時,會創建一個ProductService對象並與匹配的GoalChallenge對象,但GoalChallenge-> product_service屬性中應該有2個ProductService對象(查詢應該匹配2行),而是創建一個重複的GoalChallenge對象,其中包含與product_service屬性不同的所有其他屬性值,其中包含查詢中第二個匹配對象
我需要兩個匹配的ProductService對象作爲同一個GoalChallenge對象的一部分(與查詢匹配) - 我該如何做到這一點?
如果您還有其他問題,請詢問。真的很感謝任何幫助!下面的代碼;
GoalChallenge.class.php
<?php
class GoalChallenge
{
private $id;
private $persona_id;
private $title;
private $item_category;
private $description;
private $solution;
private $product_service;
private $research_checklist;
private $subtopics;
private $keywords;
private $status;
public function __construct(
$id = null,
$persona_id = null,
$title = null,
$item_category = null,
$description = null,
$solution = null,
ProductService $product_service = null,
$research_checklist = null,
$subtopics = null,
$keywords = null,
$status = null
) {
$this->id = $id;
$this->persona_id = $persona_id;
$this->title = $title;
$this->item_category = $item_category;
$this->description = $description;
$this->solution = $solution;
$this->product_service = $product_service;
$this->research_checklist = $research_checklist;
$this->subtopics = $subtopics;
$this->keywords = $keywords;
$this->status = $status;
}
public function getProductService()
{
return $this->product_service;
}
public function setProductService(ProductService $product_service)
{
$this->product_service = $product_service;
}
}
而我GoalChallengeMapper.class.php;
class GoalChallengeMapper
{
protected $dblayer;
public function __construct(PDO $dblayer)
{
$this->dblayer = $dblayer;
}
public function saveField($id, $field, $data)
{
try {
$this->dblayer->beginTransaction();
$stmt = $this->dblayer->prepare("UPDATE goals_challenges SET $field = :data WHERE id = :id");
$stmt->bindParam(':id', $id);
$stmt->bindParam(':data', $data);
$stmt->execute();
$this->dblayer->commit();
return $stmt->rowCount();
} catch(PDOException $e) {
$this->dblayer->rollBack();
echo $e->getMessage();
exit;
}
}
public function findByPersonaId($persona_id)
{
try {
$this->dblayer->beginTransaction();
$stmt = $this->dblayer->prepare("SELECT goals_challenges.*, products_services.id as psid, products_services.url, products_services.feature_benefit from goals_challenges LEFT JOIN products_services ON goals_challenges.id = products_services.goal_challenge_id WHERE goals_challenges.persona_id = :persona_id");
$stmt->bindParam(':persona_id', $persona_id);
$stmt->execute();
$this->dblayer->commit();
$result_set = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$result_set[] = $this->mapObject($row);
}
return $result_set;
} catch (PDOException $e) {
$this->dblayer->rollBack();
echo $e->getMessage();
exit;
}
}
public function mapObject(array $row)
{
$entry = new GoalChallenge();
$entry->setId($row['id']);
$entry->setPersonaId($row['persona_id']);
$entry->setTitle($row['title']);
$entry->setItemCategory($row['item_category']);
$entry->setDescription($row['description']);
$entry->setSolution($row['solution']);
$entry->setProductService(new ProductService($row['psid'], $row['id'], $row['url'], explode(',', $row['feature_benefit'])));
$entry->SetResearchChecklist($row['research_checklist']);
$entry->setSubtopics($row['subtopics']);
$entry->setKeywords($row['keywords']);
$entry->setStatus($row['status']);
return $entry;
}
}
最後,我ProductService類(減去getter和setter)
class ProductService
{
private $id;
private $goal_challenge_id;
private $url;
private $feature_benefit = [];
public function __construct($id = null, $goal_challenge_id = null, $url = null, array $feature_benefit = null)
{
$this->id = $id;
$this->goal_challenge_id = $goal_challenge_id;
$this->url = $url;
$this->feature_benefit = $feature_benefit;
}
}
這是輸出
GoalChallenge Object
(
[id:GoalChallenge:private] => 173
[persona_id:GoalChallenge:private] => 14
[title:GoalChallenge:private] => Lead Gen
[item_category:GoalChallenge:private] => Business Challenge
[description:GoalChallenge:private] =>
[solution:GoalChallenge:private] => Advertising
[product_service:GoalChallenge:private] => ProductService Object
(
[id:ProductService:private] => 1
[goal_challenge_id:ProductService:private] => 173
[url:ProductService:private] => www.google.com
[feature_benefit:ProductService:private] => Array
(
[0] => good for testing
[1] => mobile
)
)
[research_checklist:GoalChallenge:private] => 0,0,0,0,0,0
[subtopics:GoalChallenge:private] =>
[keywords:GoalChallenge:private] => ,,,,
[status:GoalChallenge:private] => 1
)
GoalChallenge Object
(
[id:GoalChallenge:private] => 173
[persona_id:GoalChallenge:private] => 14
[title:GoalChallenge:private] => Lead Gen
[item_category:GoalChallenge:private] => Business Challenge
[description:GoalChallenge:private] =>
[solution:GoalChallenge:private] => Advertising
[product_service:GoalChallenge:private] => ProductService Object
(
[id:ProductService:private] => 3
[goal_challenge_id:ProductService:private] => 173
[url:ProductService:private] => www.test.com
[feature_benefit:ProductService:private] => Array
(
[0] => good for searching
[1] => well known
)
)
[research_checklist:GoalChallenge:private] => 0,0,0,0,0,0
[subtopics:GoalChallenge:private] =>
[keywords:GoalChallenge:private] => ,,,,
[status:GoalChallenge:private] => 1
)
的mysql> SELECT goals_challenges。*,products_services.id的PSID, products_services.url,products_services.feature_benefit FROM goals_challenges LEFT JOIN products_services ON goals_challenges.id = products_services.goal_challenge_id WHERE goals_challenges.persona_id = 14 ;在集
+-----+------------+----------+--------------------+-------------+-------------+-----------------+--------------------+-----------+----------+--------+------+----------------+--------------------------------+
| id | persona_id | title | item_category | description | solution | product_service | research_checklist | subtopics | keywords | status | psid | url | feature_benefit |
+-----+------------+----------+--------------------+-------------+-------------+-----------------+--------------------+-----------+----------+--------+------+----------------+--------------------------------+
| 173 | 14 | Lead Gen | Business Challenge | | Advertising | NULL | 0,0,0,0,0,0 | NULL | ,,,, | 1 | 1 | www.google.com | good for testing, mobile |
| 173 | 14 | Lead Gen | Business Challenge | | Advertising | NULL | 0,0,0,0,0,0 | NULL | ,,,, | 1 | 3 | www.test.com | good for searching, well known |
+-----+------------+----------+--------------------+-------------+-------------+-----------------+--------------------+-----------+----------+--------+------+----------------+--------------------------------+
2行(0.00秒)
的print_r($ goals_challenges)
Array
(
[173] => Array
(
[id] => 173
[persona_id] => 14
[title] => Lead Gen
[item_category] => Business Challenge
[description] =>
[solution] => Advertising
[research_checklist] => 0,0,0,0,0,0
[subtopics] =>
[keywords] => ,,,,
[status] => 1
[psid] => 1
[url] => www.google.com
[feature_benefit] => good for testing, mobile
[product_services] => Array
(
[0] => Array
(
[0] => 1
[1] => www.google.com
[2] => good for testing, mobile
)
[1] => Array
(
[0] => 3
[1] => www.test.com
[2] => good for searching, well known
)
)
)
)
聽起來好像連接查詢返回許多相關表的列值(正如在一對多關係中所預期的那樣)。請發佈由查詢產生的輸出示例,以幫助我們瞭解重複的內容。您可能需要更復雜的邏輯來對其進行排序 –
在前端發佈了foreach循環的輸出代碼。如您所見,除了 - > product_service,第一個對象具有查詢中的第一個匹配行之外,這兩個對象是相同的,然後新的GoalChallenge類包含查詢中第二個匹配的行 – DJC
如果您真的會更有幫助將查詢結果作爲來自SQL客戶端的表粘貼,而不是從PHP轉儲。 –