迁移:
public function up()
{
Schema::create('rewards', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned()->comment('操作用户');
$table->integer('target_user')->unsigned()->comment('目标用户');
$table->bigInteger('amount')->unsigned()->comment('打赏金额');
$table->morphs('rewardable');
$table->timestamps();
});
}
表结构:
模型:
<?php declare(strict_types=1); namespace Zhiyi\Plus\Models; use Illuminate\Database\Eloquent\Model; class Reward extends Model
{
/**
* The guarded attributes on the model.
*
* @var array
*/
protected $guarded = ['id', 'created_at', 'updated_at'];
/**
* Has rewardable.
*
* @return \Illuminate\Database\Eloquent\Relations\MorphTo
* @author Seven Du <[email protected]>
*/
public function rewardable()
{
return $this->morphTo();
}
/**
* Has user for the rewardable.
*
* @author bs<[email protected]>
* @return \Illuminate\Database\Eloquent\Relations\HasOne|null
*/
public function user()
{
return $this->hasOne(User::class, 'id', 'user_id');
}
/**
* Has target for the rewardable.
*
* @return \Illuminate\Database\Eloquent\Relations\HasOne
*/
public function target()
{
return $this->hasOne(User::class, 'id', 'target_user');
}
}
动态打赏:
资讯打赏:
用户打赏记录:
<?php declare(strict_types=1); namespace Zhiyi\Plus\Models\Relations; use Zhiyi\Plus\Models\User;
use Zhiyi\Plus\Models\Reward; trait UserHasReward
{
/**
* 用户的被打赏记录.
*
* @author bs<[email protected]>
* @return \Illuminate\Database\Eloquent\Relations\morphMany
*/
public function beRewardeds()
{
return $this->morphMany(Reward::class, 'rewardable');
} /**
* 打赏用户.
*
* @author bs<[email protected]>
* @param mix $user
* @param float $amount
* @return mix
*/
public function reward($user, $amount)
{
if ($user instanceof User) {
$user = $user->id;
} return $this->getConnection()->transaction(function () use ($user, $amount) {
return $this->beRewardeds()->create([
'user_id' => $user,
'target_user' => $this->id,
'amount' => $amount,
]);
});
}
帖子打赏: