我在我的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项目网的每个角落,但到目前为止还没有运气。
感谢你们提出的建议。
答案 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