gpt4 book ai didi

php - 如何在 Zend\Db (Zend Framework 2) 中处理多对多关系

转载 作者:搜寻专家 更新时间:2023-10-31 21:55:45 25 4
gpt4 key购买 nike

我有一个 ZF2 应用程序,其中包含具有多对多关系的帖子和散列标签的数据库表。表定义是:

CREATE TABLE `hash_tag` (
`id` int(11) NOT NULL,
`tag` varchar(255) NOT NULL
)

CREATE TABLE `post` (
`id` int(11) NOT NULL,
`text` varchar(255)NOT NULL,
`addedOn` datetime NOT NULL
)

CREATE TABLE `post_hashtag` (
`post_id` int(11) NOT NULL,
`hashtag_id` int(11) NOT NULL
)

我还按照 ZF2 文档的 user guide 中解释的模式创建了模型. HashTag模型如下:

namespace Application\Model;

use Application\Model\Post;

class HashTag
{
public $id;
public $tag;

protected $posts = array();

public function exchangeArray($data)
{
$this->id = empty($data['id']) ? null : $data['id'];
$this->tag = empty($data['tag']) ? null : $data['tag'];
}

public function getPosts()
{
return $this->posts;
}

public function addPost(Post $post)
{
$this->posts[] = $post;
return $this;
}

}

虽然该指南很好地解释了如何处理基本数据库模型,但我希望做一些更复杂的事情。

基本上,当我检索散列标签记录时,我还想检索它们的相关帖子并以某种方式将它们存储在每个单独的 HashTag 对象中。进行正常的连接查询会为每个散列标签及其随附的帖子生成一条新记录,这并没有多大帮助。该文档也没有详细说明如何执行此操作,我也无法在 Google 上找到任何相关示例。

我过去使用过 Doctrine 2,并且通常会继续这样做。然而,我正在准备一份新工作,而我的新雇主使用 Zend\Db。我这样做基本上是为了练习在不使用 Doctrine 的情况下处理数据库操作。

最佳答案

有同样的问题,我仍然不知道我的方法是否是一个好方法,但它有效。我为每个需要处理 m-m 关系的实体创建了一个“映射器”(通用名称 ftw)。这里有一些例子:

class AddresseeMapper {

private $resultSet;

private $addresseeArray = array();
private $addreseeObjectsArray = array();

public function __construct($resultSet)
{
$this->resultSet = $resultSet;
}

public function init()
{
foreach($this->resultSet as $key => $result)
{
$addressee = array();

if(!empty($this->addresseeArray[$result['AddresseeID']]))
{
$addressee = $this->addresseeArray[$result['AddresseeID']];
}
else
{
$addressee['id'] = $result['AddresseeID'];
$addressee['documentID'] = $result['AddresseeDocumentID'];
$addressee['communicationID'] = $result['AddresseeCommunicationID'];
$addressee['addressID'] = (!empty($result['AddresseeAddressID'])) ? $result['AddresseeAddressID'] : null;
$addressee['salutation'] = (!empty($result['AddresseeSalutation'])) ? $result['AddresseeSalutation'] : null;
$addressee['tempEmail'] = (!empty($result['AddresseeTempEmail'])) ? $result['AddresseeTempEmail'] : null;

if((!empty($result['ContactID'])) && $result['ContactID'])
{
$addressee['Contact'] = $this->setContact($this->resultSet);
}

if((!empty($result['MailingListID'])) && $result['MailingListID'])
{
$addressee['MailingList'] = $this->exchangeMailingList($result);
}

}
$this->addresseeArray[$result['AddresseeID']] = $addressee;
}
}

private function setContact($resultSet)
{
$contactMapper = new ContactMapper($resultSet);
$contactMapper->init();
$contactMapper->serilizeObjects();

return $contactMapper->getContact();
}

private function exchangeMailingList($result)
{
$mailingList = new MailingList();
$mailingList->exchangeArray($result);

return $mailingList;
}

public function serilizeObjects()
{
foreach($this->addresseeArray as $addresseeArray)
{
$addressee = new Addressee();
$addressee = $this->loop($addresseeArray, $addressee);

$this->addreseeObjectsArray[] = $addressee;
}

}

private function loop($array, $object)
{
foreach($array as $key => $value)
{
if(is_array($value) && is_object($object->$key))
{
$object->$key = $this->deepLoop($value, $object->$key);
}
elseif(is_array($object->$key))
{
foreach($value as $key2 => $value2)
{
array_push($object->$key, $value2);
}
}
else
{
$object->$key = $value;
}

}

return $object;
}

private function deepLoop($array, $object)
{
foreach($array as $key => $value)
{
//var_dump($key);
//var_dump($value);
$object->$key = $value;
}

return $object;
}

public function getAddressees()
{
return $this->addreseeObjectsArray;
}

public function getAddressee()
{
foreach($this->addreseeObjectsArray as $addressee)
{
return $addressee;
}

return false;
}

关于php - 如何在 Zend\Db (Zend Framework 2) 中处理多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33970319/

25 4 0
文章推荐: xcode - iOS : Using HanekeSwift with SwiftyJSON
文章推荐: html - 如何使用 CSS(无 javascript)添加文本或字符?
文章推荐: ios - Swift:当我转到另一个 View Controller 时,内存未清除,收到内存警告
文章推荐: jquery - 如何强制隐藏+空的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com