Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Laravel 5.2.x + jenssegers/mongodb 3.0.x, find() возвращает NULL 
V
    Опции темы
doctor2k
Дата 8.8.2016, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 15.5.2010
Где: Russia, Samara

Репутация: нет
Всего: нет



Доброго времени суток, уважаемые господа, товарищи, граждане. Коллеги. Друзья. Братья.

Проблема в следующем. Имеется Laravel 5.2.x с прикрученным к нему расширением для работы с MongoDB. Дока в принципе подробная, штуковина работает, но вот понадобилось мне N дней назад взять объект по его _id. И тут я напоролся на грабли.

В доке указано просто:
Код

$user = User::find('517c43667db388101e00000f');

То есть, по сути, _id передаём строкой. Но этот код возвращает NULL. Помню, когда для Yii писал свою обёртку, там взаимодействие с монгой было через PHPшное расширение, и надо было перед обращением к базе превратить строку в MongoId, т.е.:
Код

$_id = new MongoId( $id );

Здесь такое не срабатывает. Я полез в исходники самого расширения, нашёл следующие вещи:
Код

public function find($id, $columns = [])
    {
        return $this->where('_id', '=', $this->convertKey($id))->first($columns);
    }

Код

public function convertKey($id)
    {
        if (is_string($id) and strlen($id) === 24 and ctype_xdigit($id)) {
            return new ObjectID($id);
        }

        return $id;
    }

Т.е. find() это просто такая обёртка для where(). Ладно, пробуем по-другому. Пишем сами через where():
Код

    $subject = SubjectModel::where( '_id', '=', '551d4530bfef316a3c8b7949' )->get();

Возвращается фигня. var_dump() выдаёт следующее:
Код

object(Illuminate\Database\Eloquent\Collection)#174 (1) {
  ["items":protected]=>
  array(0) {
  }
}

Хотя объект под таким _id есть в коллекции, и через консоль Robomongo прекрасно ищется.
Помогите пожалуйста найти решение проблемы, или хотя бы подскажите в какую сторону смотреть.
Заранее спасибо.
PM MAIL ICQ Skype   Вверх
doctor2k
Дата 11.8.2016, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 15.5.2010
Где: Russia, Samara

Репутация: нет
Всего: нет



Решил проблему. Переопределил метод find() в модели, стало так (на примере UserModel.php):

Код

namespace App;

use Jenssegers\Mongodb\Eloquent\Model as Eloquent;

class UserModel extends Eloquent
{
    protected $collection = 'user';

    public static function find( $mongo_id )
    {
        if( !is_string( $mongo_id )
            OR !mb_strlen( $mongo_id )
            OR !ctype_xdigit( $mongo_id )
            ):
            return FALSE;
        endif;

        return Self::whereRaw( [ '_id' => $mongo_id ] )->first();
    }
}


Не претендую на абсолютную правильность решения, но меня устраивает.

Это сообщение отредактировал(а) doctor2k - 11.8.2016, 12:17
PM MAIL ICQ Skype   Вверх
_zorn_
Дата 20.1.2017, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Цитата(doctor2k @  8.8.2016,  18:39 Найти цитируемый пост)
 if (is_string($id) and strlen($id) === 24 and ctype_xdigit($id))

Само по себе использование "and" вместо "&&" (интересно зачем ?) чревато подводными камнями (приоритеты операторов).
А если разработчик их использует, значит полюбому где нибудь и наткнется. Короче нет доверия этому коду )

http://stackoverflow.com/questions/2803321...-vs-as-operator
Цитата

$this = true;
$that = false;

$truthiness = $this and $that;
var_dump($truthiness); //bool(true)


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1237 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.