【问题标题】:Redbean: How does one get last inserted id of owned Bean?Redbean:如何获得拥有的 Bean 的最后插入 id?
【发布时间】:2013-11-26 04:18:28
【问题描述】:

我在我的 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 项目网站的每个角落,但到目前为止没有运气。

谢谢大家的建议。

【问题讨论】:

    标签: orm redbean


    【解决方案1】:

    使用常识,我终于想出了如何优雅地解决这个问题,因为到目前为止没有人回答我的问题,所以我自己做吧。

    由于R::store($user) 能够同时存储$user$site,因此没有必要手动存储$site 对象。

    但是,如果您需要获取所拥有 bean 的最后插入 id,这样做确实没有什么坏处。通过存储$site 对象,框架将执行完全相同的操作,并且在此之上它返回resired 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,我真诚地希望这对将来遇到类似问题的人有所帮助。

    【讨论】:

      【解决方案2】:

      有一个函数叫做 R::findLast('...')

      $last_record = R::findLast('...');
      

      【讨论】:

      • 虽然这段代码可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多