Redbean:如何获得拥有Bean的最后插入ID?

时间:2013-11-13 14:09:15

标签: orm redbean

我在我的MVP项目中使用RedBeanPHP 3.5.1 for ORM(由Nette FW提供)。

我需要获取最后一个插入元素的ID,该元素由另一个表中的元素拥有。下面你可以找到代表我刚刚描述的功能的方法:

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 存储到$id变量中,因为它已由现有用户拥有。而不是它用我没有进一步使用的用户ID填充变量。

所以我的问题是:如何获取刚刚通过在父(刚加载)bean上调用R::store()方法创建的自有bean的最后插入ID?是否有实现这在RedBean还是我必须手动完成?

我浏览了RedBeanPHP项目网的每个角落,但到目前为止还没有运气。

感谢你们提出的建议。

4 个答案:

答案 0 :(得分:4)

使用常识我终于找到了如何优雅地解决这个问题,因为到目前为止还没有人回答我的问题,让我自己就这样做。

由于R::store($user)能够存储$user$site,因此误导性地无需手动存储$site对象。

但是如果你需要获得自拥bean的最后插入ID,那么这样做确实没有坏处。通过存储$site对象框架将执行完全相同的操作,并在之上返回已停用的ID

所以正确的方法实现如下:

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,我衷心希望这能帮助将来遇到类似问题的人。

答案 1 :(得分:0)

有些事情使我无所适从,您说不需要手动注册readingTime对象,但这就是您要做的:

$site

此过程不会创建两个查询吗?

这可以有一个优雅的表示法,并且可以避免重新启动另一个查询,但是就性能而言,我们同意结果类似于两个SQL查询。

答案 2 :(得分:0)

有一个名为R :: findLast('...')

的函数。
$last_record = R::findLast('...');

答案 3 :(得分:0)

不确定这是否是 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