1

Hi after some hours of searching i finally give up, I cant find any way of getting this thing done, I want to know if it is possible to create an EmbedMany relation using an php assiociative array.

I can use the @field(type="hash") but then I cant add a Embedded document to that key!

Here is the code I have now:

<?php

namespace Entity;

/**
 * @Document(collection="object_types")
 */
class OType
{
    /**
     * @Id
     * @var integer
     */
    private $id;

    /**
     * @Field(type="string")
     * @var string
     */
    private $name;

    /** 
     * @EmbedMany(targetDocument="Property")
     */
    private $properties = array();

    /**
     * Node Type
     *
     * @param string $name
     */
    public function __construct($name)
    {
        $this->name = $name;


    }

    /**
     * Set name
     *
     * @param string $name
     * @return void
     */
    public function setName($name)
    {
        $this->name = $name;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Add property
     *
     * @param Property $property
     */
    public function addProperty(Property $property)
    {
        $this->properties[$property->getName()] = $property;
    }

    /**
     * Get properties
     *
     * @return Property[]
     */
    public function getProperties()
    {
        return $this->properties;
    }
}

I want to do something like this:

$property = new Property();
$property->setName('memberof');
$property->setType('string');

$type = new OType();
$type->setName('user');
$type->addProperty($property);

And get this result:

{
  "_id": {
    "$oid": "4d89ae2c2eea0f8406000004"
  },
  "name": "user",
  "properties": [
    "memberof": {
      "name": "memberof",
      "type": "string"
    }
  ]
}

Thanks for you help.

Best regards Flamur

3 Answers 3

4

Actually, you CAN, use strategy="set" E.g:

@EmbedMany(targetDocument="Field", strategy="set")

Make sure to read THROUGH doctrine's documentation on collections:

http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/reference-mapping.html

Sign up to request clarification or add additional context in comments.

Comments

0

I'm afraid you can't do that.

Make sure to read doctrine's documentation on collections: http://www.doctrine-project.org/docs/mongodb_odm/1.0/en/reference/reference-mapping.html

Comments

0

You shouldn't do that (just stick to one way of doing this: or you use always the associative array, or you use embedded documents)

However, this trick can help:

Just transform your the values in your properties array so that they all be Property objects.

//Add to your document:
/** @PostLoad */
public function postLoad()
{
    foreach($this->properties as $k => $p) {
        if(is_array($p)) {
            $newP = new Property();
            $newP = $p['name'];
            //..
            $this->properties[$k] = $newP;
        }
    }
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.