簡體   English   中英

我可以在 Doctrine2 中迭代實體的屬性嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM