[英]Can I iterate over an Entity's properties in Doctrine2?
我用
$myblogrepo = $this->_doctrine->getRepository('Entities\Blog')->findBy(array('id' => 12);
我通過訪問
foreach($myblogrepo as $key =>$value){
echo $key . $value;
}
我怎樣才能得到字段名稱? 我認為 key => 會起作用,但它會將 key 打印為 0
所以我認為這會起作用:
foreach($myblogrepo[0] as $key =>$value){
echo $key . $value;
}
但仍然沒有..}
您的 Blog 實體的屬性很可能被聲明為protected
。 這就是為什么您不能從實體本身之外迭代它們的原因。
如果您以只讀方式使用博客實體,並且只需要訪問標記為 @Columns 的屬性(閱讀:您不需要調用實體上的任何方法),您可以考慮使用數組水合. 這樣,您將處理簡單的 arrays,並且$k=>$v
類型迭代將正常工作。
否則,您需要在您的實體 class 上創建某種 getValues() 方法。 這可能是一個簡單的實現,它只是構建和排列並返回它。
最后,您可以創建一個通用的 getValues() 作為實用程序 function,它使用學說的 class 元數據來確定哪些列和實體具有,並對這些數據進行操作。 像這樣的簡單實現:
function getEntityColumnValues($entity,$em){
$cols = $em->getClassMetadata(get_class($entity))->getColumnNames();
$values = array();
foreach($cols as $col){
$getter = 'get'.ucfirst($col);
$values[$col] = $entity->$getter();
}
return $values;
}
編輯- 上述方法的更成熟版本似乎在這里可用- 我還沒有玩過它,但它看起來很有希望。
如果您只需要快速簡單地獲取實體的屬性,這就是我在項目中所做的:
我所有的實體都繼承自 EntityBase class,它具有以下方法:
public function toValueObject()
{
$result = new \stdClass();
foreach ($this as $property => $value) {
$getter = 'get' . ucfirst($property);
if (method_exists($this, $getter)) {
$result->$property = $this->$getter();
}
}
return $result;
}
所以我所要做的就是調用$entity->toValueObject()
並獲得一個標准的 object ,其中所有實體的屬性都是公共屬性。
使用findOneBy
而不是findBy
到 select 單行。
$myblogrepo = $this->_doctrine->getRepository('Entities\Blog')->findOneBy(array('id' => 12);
您的鍵是0
,因為它是可能的多行結果中的第一行。
這是我對序列化程序 class 的實現,它還檢查它是否是 doctrine 實體:
/**
* JsonApiSerializer constructor.
* @param EntityManagerInterface $em
*/
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
/**
* @param $payLoad
* @return string
*/
public function serialize($payLoad, $type)
{
$serializedPayload = new \stdClass();
$serializedPayload->data = new \stdClass();
$serializedPayload->data->type = $type;
if ($this->isDoctrineEntity($payLoad)) {
$this->addEntityColumnValues($serializedPayload, $payLoad);
}
return json_encode($serializedPayload);
}
private function isDoctrineEntity($payLoad)
{
if (is_object($payLoad)) {
$payLoad = ($payLoad instanceof Proxy)
? get_parent_class($payLoad)
: get_class($payLoad);
}
return !$this->em->getMetadataFactory()->isTransient($payLoad);
}
private function addEntityColumnValues(&$serializedPayload, $entity){
$serializedPayload->data->attributes = new \stdClass();
$classMetaData = $this->em->getClassMetadata(get_class($entity));
$columnNames = $classMetaData->getColumnNames();
foreach($columnNames as $columnName){
$fieldName = $classMetaData->getFieldForColumn($columnName);
$getter = 'get'.ucfirst($fieldName);
$serializedPayload->data->attributes->$columnName = $entity->$getter();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.