php Laravel中的多行递增

brc7rcf0  于 2023-04-19  发布在  PHP
关注(0)|答案(2)|浏览(126)

我有一个复杂的问题需要帮助:
Logic
1.表subscriptions具有包含user_id的行(每个用户可以有许多行)
1.表products需要tokens(产品A需要示例2令牌)
1.现在这个令牌必须根据用户订阅量计算。假设用户在订阅表中有2行,一行有1令牌,另一行有5令牌(用户总共有6个令牌),他只需要使用其中的2
1.我在这里要做的是更新这个用户的订阅表,并通过递增来标记他的行used_tokens列。
你现在可能有点困惑了!这里有一些截图,可以让你在视觉上理解它。
products table

subscriptions table

问题

问题是我无法更新subscriptions表中这两行中的used_tokens列。

这是它最后应该是什么样子

代码

这就是我目前所做的(获得正确的产品,获得用户订阅),我需要更新这些订阅:

$product = Product::findOrFail($request->input('product_id')); // Get product
$required_tokens = $product->required_tokens; // Get product require tokens (i.e. 2)
$subscriptions = Subscription::where('user_id', $user->id)->where('isPaid', true)->where('used_tokens', '<', 'tokens')->get(); // Get user subscription rows

如何更新(增量)这些行中的used_tokens

ef1yzkbh

ef1yzkbh1#

像这样的东西怎么样?

$product = Product::findOrFail($request->input('product_id'));
$required_tokens = $product->required_tokens;
$subscriptions = Subscription::where('user_id', $user->id)->where('isPaid', true)->where('used_tokens', '<', 'tokens')->get();

$remaining_tokens = $required_tokens;

foreach ($subscriptions as $subscription) {
  if ($remaining_tokens > 0) {
    $row = DB::table('subscriptions')
       ->where('id', $subscription->id)
       ->first();

    if(!empty($row)) {
      $available_tokens = $row->tokens - $row->used_tokens;

      if ($available_tokens > 0) {
        $tokens_to_be_used = ($remaining_tokens >= $available_tokens) ? $available_tokens : $remaining_tokens;

        $final_used_tokens = $row->used_tokens + $tokens_to_be_used;

        DB::table('subscriptions')
           ->where('id', $subscription->id)
           ->update([
               'used_tokens' => final_used_tokens,
           ]);

        $remaining_tokens = $remaining_tokens - $available_tokens;
      }
    }
  }
}

最终(清理)代码

$subscriptions = Subscription::where('user_id', $user->id)->where('isPaid', true)->get();

foreach ($subscriptions as $subscription) {
    if($subscription->used_tokens < $subscription->tokens){
        if ($required_tokens > 0) {
            $available_tokens = $subscription->tokens - $subscription->used_tokens;
            $tokens_to_be_used = ($required_tokens >= $available_tokens) ? $available_tokens : $required_tokens;
            $final_used_tokens = $subscription->used_tokens + $tokens_to_be_used;
            DB::table('subscriptions')
            ->where('id', $subscription->id)
            ->update([
                'used_tokens' => $final_used_tokens,
            ]);
            $required_tokens = $required_tokens - $available_tokens;
        }
    }
}
2g32fytz

2g32fytz2#

你可以在Laravel中使用Laravel雄辩的关系一次更新多个模型

#App\Models\User.php
class User extends Authennticable {
    public function subscriptions ()
    {
        return $this->hasMany(Subscription::class);
    }
}

设置此关系后,可以使用以下代码更新用户的订阅:

$user = User::find($id);

$user->subscriptions()->where(isPaid, true)->upadte(['used_tokens' => 'new_value']);

相关问题