Skip to content

Latest commit

 

History

History
52 lines (42 loc) · 2.83 KB

usage-mongoid.md

File metadata and controls

52 lines (42 loc) · 2.83 KB

Особенности MongoId

Получение скаляра из ID документа

Remember: идентификатор документа MongoDB (поле _id) не является скаляром, но представляет собой экземпляр класса [[\MongoDB\BSON\ObjectID]]. Чтобы получить фактическую строку Mongo ID, вы должны привести тип экземпляра [[\MongoDB\BSON\ObjectID]] к строке:

$query = new Query();
$row = $query->from('customer')->one();
var_dump($row['_id']); // вывод: "object(\MongoDB\BSON\ObjectID)"
var_dump((string) $row['_id']); // вывод: "string 'acdfgdacdhcbdafa'"

Хотя это обстоятельство, иногда, весьма полезно, но часто приводит к некоторым проблемам. Вы можете столкнуться с ними составляя URL или при попытке сохранения _id в другое хранилище. В этих случаях убедитесь, что вы конвертировали [[\MongoDB\BSON\ObjectID]] в строку:

/* @var $this yii\web\View */
echo $this->createUrl(['item/update', 'id' => (string) $row['_id']]);

То же самое относится и к реализации идентификационных данных пользователя, которые хранятся в MongoDB. При реализации [[\yii\web\IdentityInterface::getId()]] вы должны привести [[\MongoDB\BSON\ObjectID]] класс к скаляру чтобы аутентификация начала работать.

Получение ID документа из скаляра

При задании условия, значения для ключа _id будет автоматически приведено к [[\MongoDB\BSON\ObjectID]] например, даже если они простые строки. Так что нет необходимости выполнять обратное приведение _id к строке:

use yii\web\Controller;
use yii\mongodb\Query;

class ItemController extends Controller
{
    /**
     * @param string $id MongoId строка (не является объектом)
     */
    public function actionUpdate($id)
    {
        $query = new Query;
        $row = $query->from('item')
            ->where(['_id' => $id]) // неявное приведение типа [[\MongoDB\BSON\ObjectID]]
            ->one();
        ...
    }
}

Тем не менее, если у вас есть другие столбцы, содержащие [[\MongoDB\BSON\ObjectID]], вы должны позаботиться о возможном приведении типов на свое усмотрение.