Redbean: Как получить последний вставленный идентификатор принадлежащего Bean?

Я использую RedBeanPHP 3.5.1 для ORM в моем проекте MVP (на платформе Nette FW).

Мне нужно получить идентификатор последнего вставленного элемента, принадлежащего элементу из другой таблицы. Ниже вы можете найти метод, представляющий функциональность, которую я только что описал:

public function createSite($userId, $siteName, $feedUrl, $reloadTime, $reloadRate){
    $site = R::dispense('site');
    $site->user_id = $userId;
    $site->name = $siteName;
    $site->feed = $feedUrl;
    $site->reload_time = $reloadTime;
    $site->reload_rate = $reloadRate;

    $user = R::load('user', $userId);
    $user->ownSite[] = $site;
    $id = R::store($user);

    return $id; 
}

Теперь я бы предположил, что линия

$id = R::store($user);

сохранит идентификатор сайта в переменной $id, поскольку он принадлежит уже существующему пользователю. Вместо этого он заполняет переменную идентификатором пользователя, который мне больше не нужен.

Итак, мой вопрос: Как мне получить последний вставленный идентификатор собственного компонента, который был только что создан, путем вызова метода R::store() для родительского (только что загруженного) компонента? Есть ли реализация этого в RedBean или у меня есть сделать это вручную?

Я просмотрел каждый уголок сети проекта RedBeanPHP, но пока безуспешно.

Спасибо за возможные предложения, ребята.


person Dejv    schedule 13.11.2013    source источник


Ответы (3)


Используя здравый смысл, я, наконец, понял, как решить это элегантно, и, поскольку пока никто не ответил на мой вопрос, я просто делаю это сам.

Поскольку R::store($user) может хранить как $user, так и $site, нет необходимости сохранять объект $site вручную.

Но если вам нужно получить последний вставленный идентификатор принадлежащего компонента, в этом нет ничего плохого. При сохранении $site объекта фреймворк сделает то же самое и, кроме того, вернет требуемый идентификатор.

Итак, правильная реализация метода выглядит так:

public function createSite($userId, $siteName, $feedUrl, $reloadTime, $reloadRate){
    $site = R::dispense('site');
    $site->user_id = $userId;
    $site->name = $siteName;
    $site->feed = $feedUrl;
    $site->reload_time = $reloadTime;
    $site->reload_rate = $reloadRate;

    $user = R::load('user', $userId);
    $user->ownSite[] = $site;

    $id = R::store($site);
    R::store($user);

    return $id;
}

Итак, в заключение, снимаю шляпу перед RedBeanPHP ORM FW, и я искренне надеюсь, что это поможет людям с подобной проблемой в будущем.

person Dejv    schedule 14.11.2013

Есть функция R::findLast('...')

$last_record = R::findLast('...');
person woody180    schedule 02.02.2020
comment
Хотя этот код может решить вопрос, включение объяснения действительно помогает улучшить качество вашего поста. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода. - person Muhammad Dyas Yaskur; 02.02.2020

Не уверен, что это был бы правильный ответ 7 лет назад, но, по крайней мере, сейчас нет необходимости выполнять какую-либо дополнительную работу:

$shop = R::dispense( 'shop' );
$shop->name = 'Antiques';
$vase = R::dispense( 'product' );
$vase->price = 25;
$shop->ownProductList[] = $vase
R::store( $shop );
echo $vase->$id; // <-- yes, id which was created by database is present here
person wha7ever    schedule 09.01.2021