dealhub/app/Models/Deal.php
kusowl f33f68cd3e feat(user interaction): add favorite interaction
- refactor controller to handle favorite
- show like count and update when liked a deal
- maintain like and favorite state with server
2026-01-16 14:30:24 +05:30

67 lines
1.8 KiB
PHP

<?php
namespace App\Models;
use App\Enums\InteractionType;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Support\Facades\Auth;
class Deal extends Model
{
public function broker(): BelongsTo
{
return $this->belongsTo(User::class, 'user_id');
}
public function category(): BelongsTo
{
return $this->belongsTo(DealCategory::class, 'deal_category_id');
}
public function interactions(): HasMany
{
return $this->hasMany(Interaction::class);
}
/**
* Get deals that are active
* @param Builder $query
* @return Builder
*/
public function scopeWithActiveDeals(Builder $query): Builder
{
return $query->where('active', true);
}
/**
* Get if the current user has liked or favorite the deal
* @param Builder $query
* @return Builder
*/
public function scopeWithCurrentUserInteractions(Builder $query): Builder
{
return $query->withExists([
'interactions as is_liked' => function ($query) {
$query->where('user_id', Auth::id())
->where('type', InteractionType::Like);
},
'interactions as is_favorite' => function ($query) {
$query->where('user_id', Auth::id())
->where('type', InteractionType::Favorite);
}
]);
}
public function scopeWithLikes(Builder $query): Builder
{
return $query->withCount([
'interactions as total_likes' => function ($query) {
$query->where('type', InteractionType::Like);
}
]);
}
}