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.
