我有两个模型:UserPayout和UserTransaction,其中UserTransaction是多态的,需要知道它属于哪个模型。每当用户创建支付时,都应自动进行交易。如果在这个过程中出现问题,两者都应该回滚。
前段时间我已经问过这个问题并得到了这个答案:https://stackoverflow.com/a/32040189/1233206
今天我尝试按如下方式实现它:
# Controller
$user_payout = new UserPayout($input);
$user->payouts()->save($user_payout);
# TransactionHandler
// event: creating
public function onPayoutCreation($event)
{
DB::beginTransaction();
try{
$transaction = new UserTransaction(
array(
'user_id' => $event->user_id,
'value' => -$event->amount
)
);
$transaction->creator()->associate($event);
$transaction->save();
}
catch(\Exception $e)
{
DB::rollback();
throw $e;
}
DB::commit();
return true;
}
// event: creating
public function onTransactionCreation($event)
{
$user = User::find($event->user_id);
$user->balance = $user->balance + $event->value;
if(!$user->save()) throw new Exception('User could not be saved. Check for validation rules.');
return true;
}
public function subscribe($events)
{
$events->listen('eloquent.creating: UserPayout', 'TransactionHandler@onPayoutCreation');
$events->listen('eloquent.creating: UserTransaction', 'TransactionHandler@onTransactionCreation');
}
那么,根据链接的答案,应该设置外键。 Laravel确实将foreign_type设置为“UserPayout”,但foreign_id为NULL。
我在这里做错了什么或者不是这样简单地工作?我怎样才能实现我的目标?
我非常感谢任何帮助。