繁体   English   中英

使用两个查询或使用关系在两个表上插入数据

[英]Using two queries or using relation to insert data on two tables

我有两个表,一个是“用户”,另一个是“钱包”。 钱包表与用户表关联为“ hasOne”。 所以我有一个需要更新用户表和钱包表的场景。

但是问题是,我只有hasOne与用户相关的钱包。 而且我不知道我在做什么,我的方法还是不好的。 实际上是分别为用户和钱包查询两次。

因此,从代码开始,首先是查询用户以增加计数,然后再次查询钱包以执行其他查询。 这有效吗? 或者我可以将“ belongsTo”从钱包关联到用户,以便在单个查询中完成所有操作?

请指导我最好的方法。

$level_count = User::findOrFail($h)->increment('level_count', 1);
$wallet = Wallet::where('user_id', $h)->first();
$wallet->increment('wallet_balance',200);
$wallet->wallet_logs()->create(['wallet_logs' => 'Commission INR 200 
Credited']);

现在,您的代码将执行以下语句(如非常有用的Laravel Debugbar所示 ):

select * from `users` where `users`.`id` = 1 limit 1
update `users` set `level_count` = `level_count` + 1, `users`.`updated_at` = '2019-07-25 14:05:44' where `id` = 1
select * from `wallets` where `user_id` = 1 limit 1
update `wallets` set `wallet_balance` = `wallet_balance` + 200, `wallets`.`updated_at` = '2019-07-25 14:05:44' where `id` = 1
insert into `wallet_logs` (`wallet_logs`, `wallet_id`, `updated_at`, `created_at`) values ('Commission INR 200 \r\n     Credited', 1, '2019-07-25 14:05:44', '2019-07-25 14:05:44')

哪个可行,但由于用户和电子钱包之间未使用任何关系,因此代码不是很整齐。 我将其重写为:

$user = User::with('wallet')->find($h);
$user->increment('level_count', 1);
$user->wallet->increment('wallet_balance', 200);
$user->wallet->wallet_logs()->create(['wallet_logs' => 'Commission INR 200 Credited']);

User.php中将需要此关系:

public function wallet()
{
    return $this->hasOne('App\Wallet');
}

但是,这不会执行更少的查询。 除非您愿意使用查询生成器使用JOIN构造(相对复杂的)UPDATE查询,否则查询将不会减少。

我不担心查询的数量,因为它们非常简单且快速,除非您期望有大量的请求。


编辑:实际上,可以减少用于更新的查询数量,但是由于无论如何您都必须检索电子钱包(以检索其ID以写入电子钱包日志),因此并没有太大帮助。 这仅执行两个UPDATE语句:

User::where('id', $h)->increment('level_count', 1);
Wallet::where('user_id', $h)->increment('wallet_balance', 200);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM