This project is not being actively maintained. If you are interested in helping to maintain this project, take a look at the open issues on GitHub and submit pull requests.

Attachments

CouchDB supports attachments to documents and Docrine CouchDB ODM supports this aswell through a simple API.

If you specify an attachments field for a document you can access all attachments of a document of this type:

<?php/** @Document */class Article{    /** @Attachments */    private $attachments;}

The attachments field is an array of Doctrine\CouchDB\Attachment instances. Keys of the attachments array are the filenames of the attachments.

The API of the Doctrine\CouchDB\Attachment looks as follows:

<?phpnamespace Doctrine\CouchDB;class Attachment{    /**     * Get the content-type of this attachment.     *     * Does not trigger lazy loading the attachment from the database.     *      * @return string     */    public function getContentType();    /**     * Get the length of the base64 encoded representation of this attachment.     *     * Does not trigger lazy loading the attachment from the database.     *     * @return string     */    public function getLength();    /**     * Get the raw data of this attachment.     *     * @return string     */    public function getRawData();    /**     * @return string     */    public function getBase64EncodedData();    /**     * @return bool     */    public function isLoaded();    /**     * Number of times an attachment was already saved with the document, indicating in which revision it was added.     *     * @return int     */    public function getRevPos();    /**     * Attachments are special in how they need to be persisted depending on stub or not.     *     * TODO: Is this really necessary with all this special logic? Having attahments as special     * case without special code would be really awesome.     *     * @return string     */    public function toArray();    /**     * Create an Attachment from a string or resource of binary data.     *     * WARNING: Changes to the file handle after calling this method will *NOT* be recognized anymore.     *     * @param string|resource $data     * @param string $contentType     * @return Attachment     */    static public function createFromBinaryData($data, $contentType = false);    /**     * Create an attachment from base64 data.     *     * @param string $data     * @param string $contentType     * @param int $revpos     * @return Attachment     */    static public function createFromBase64Data($data, $contentType = false, $revpos = false);    /**     * Create a stub attachment that has lazy loading capabilities.     *     * @param string $contentType     * @param int $length     * @param int $revPos     * @param Client $httpClient     * @param string $path     * @return Attachment     */    static public function createStub($contentType, $length, $revPos, Client $httpClient, $path);}

You have to use one of the two methods Attachment::createFromBinaryData() and Attachment::createFromBase64Data() to create new attachments. The key of the attachments array will become the filename of this attachment.

<?php$fh = fopen(__DIR__ . '/_files/logo.jpg', 'r');$user = $dm->find('Doctrine\Tests\Models\CMS\CmsUser', 'user_with_attachment');$user->attachments['logo.jpg'] = \Doctrine\CouchDB\Attachment::createFromBinaryData($fh, 'image/jpeg');$dm->flush();

Attachments are value objects. If you want to replace an attachment with a new version just replace the Attachment instance at the appropriate filename key.