Files
admin/app/Models/Item.php
Husanjonazamov e0f1989655 classify admin
2026-02-24 12:52:01 +05:00

371 lines
11 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
class Item extends Model
{
use HasFactory, SoftDeletes;
protected $fillable = [
'category_id',
'currency_id',
'name',
'price',
'description',
'latitude',
'longitude',
'address',
'contact',
'show_only_to_premium',
'video_link',
'status',
'rejected_reason',
'user_id',
'image',
'country',
'state',
'city',
'area_id',
'all_category_ids',
'slug',
'sold_to',
'expiry_date',
'min_salary',
'max_salary',
'is_edited_by_admin',
'admin_edit_reason',
'package_id',
'region_code',
'created_at',
];
protected $appends = ['translated_name', 'translated_description'];
protected $with = ['translations'];
// Relationships
public function user()
{
return $this->belongsTo(User::class);
}
public function countryRelation()
{
return $this->belongsTo(Country::class);
}
public function currency()
{
return $this->belongsTo(Currency::class, 'currency_id');
}
public function category()
{
return $this->hasOne(Category::class, 'id', 'category_id');
}
public function gallery_images()
{
return $this->hasMany(ItemImages::class);
}
public function custom_fields()
{
return $this->hasManyThrough(
CustomField::class, CustomFieldCategory::class,
'category_id', 'id', 'category_id', 'custom_field_id'
);
}
public function item_custom_field_values()
{
return $this->hasMany(ItemCustomFieldValue::class, 'item_id');
}
public function featured_items()
{
return $this->hasMany(FeaturedItems::class)->onlyActive();
}
public function favourites()
{
return $this->hasMany(Favourite::class);
}
public function item_offers()
{
return $this->hasMany(ItemOffer::class);
}
public function user_reports()
{
return $this->hasMany(UserReports::class);
}
public function sliders(): MorphMany
{
return $this->morphMany(Slider::class, 'model');
}
public function area()
{
return $this->belongsTo(Area::class);
}
public function review()
{
return $this->hasMany(SellerRating::class);
}
public function job_applications()
{
return $this->hasMany(JobApplication::class);
}
// Accessors
public function getImageAttribute($image)
{
return ! empty($image) ? url(Storage::url($image)) : $image;
}
public function getStatusAttribute($value)
{
if ($this->deleted_at) {
return 'inactive';
}
if ($this->expiry_date && $this->expiry_date < Carbon::now()) {
return 'expired';
}
return $value;
}
public function translations()
{
return $this->hasMany(ItemTranslation::class);
}
// Scopes
public function scopeSearch($query, $search)
{
$search = '%'.$search.'%';
return $query->where(function ($q) use ($search) {
$q->orWhere('name', 'LIKE', $search)
->orWhere('description', 'LIKE', $search)
->orWhere('price', 'LIKE', $search)
->orWhere('image', 'LIKE', $search)
->orWhere('latitude', 'LIKE', $search)
->orWhere('longitude', 'LIKE', $search)
->orWhere('address', 'LIKE', $search)
->orWhere('contact', 'LIKE', $search)
->orWhere('show_only_to_premium', 'LIKE', $search)
->orWhere('status', 'LIKE', $search)
->orWhere('video_link', 'LIKE', $search)
->orWhere('clicks', 'LIKE', $search)
->orWhere('user_id', 'LIKE', $search)
->orWhere('country', 'LIKE', $search)
->orWhere('state', 'LIKE', $search)
->orWhere('city', 'LIKE', $search)
->orWhere('category_id', 'LIKE', $search)
->orWhereHas('category', function ($q) use ($search) {
$q->where('name', 'LIKE', $search);
})->orWhereHas('user', function ($q) use ($search) {
$q->where('name', 'LIKE', $search);
})->orWhereHas('translations', function ($q) use ($search) {
$q->where('name', 'LIKE', $search)
->orWhere('description', 'LIKE', $search)
->orWhere('address', 'LIKE', $search)
->orWhere('city', 'LIKE', $search)
->orWhere('state', 'LIKE', $search)
->orWhere('country', 'LIKE', $search);
});
});
}
public function scopeOwner($query)
{
if (Auth::user()->hasRole('User')) {
return $query->where('user_id', Auth::user()->id);
}
return $query;
}
public function scopeApproved($query)
{
return $query->where('status', 'approved');
}
public function scopeNotOwner($query)
{
return $query->where('user_id', '!=', Auth::user()->id);
}
public function scopeSort($query, $column, $order)
{
if ($column == 'user_name') {
return $query->leftJoin('users', 'users.id', '=', 'items.user_id')
->orderBy('users.name', $order)
->select('items.*');
}
return $query->orderBy($column, $order);
}
public function scopeFilter($query, $filterObject)
{
if (empty($filterObject)) {
return $query;
}
foreach ($filterObject as $column => $value) {
if ($column === 'category_id') {
$categoryId = (int) $value;
$isParentCategory = Category::where('id', $categoryId)
->whereNull('parent_category_id')
->exists();
if ($isParentCategory) {
$childCategoryIds = Category::where('parent_category_id', $categoryId)
->pluck('id')
->toArray();
$allCategoryIds = array_merge([$categoryId], $childCategoryIds);
$query->where(function ($q) use ($allCategoryIds) {
foreach ($allCategoryIds as $catId) {
$q->orWhereRaw('FIND_IN_SET(?, all_category_ids)', [$catId]);
}
});
} else {
$query->where('category_id', $categoryId);
}
continue; // Skip to next filter
}
if ($column == 'status') {
if ($value == 'inactive') {
$query->whereNotNull('deleted_at')
->where(function ($q) {
$q->whereNull('expiry_date')
->orWhere('expiry_date', '>=', Carbon::now());
});
} elseif ($value == 'expired') {
$query->whereNotNull('expiry_date')
->where('expiry_date', '<', Carbon::now())
->whereNull('deleted_at');
} else {
if (in_array($value, [
'review', 'approved', 'rejected',
'sold out', 'soft rejected',
'permanent rejected', 'resubmitted',
])) {
$query->whereNull('deleted_at')
->where(function ($q) {
$q->whereNull('expiry_date')
->orWhere('expiry_date', '>=', Carbon::now());
});
}
$query->where($column, $value);
}
} elseif ($column == 'featured_status') {
if ($value == 'featured') {
$query->whereHas('featured_items');
} elseif ($value == 'premium') {
$query->whereDoesntHave('featured_items');
}
} elseif (in_array($column, ['country', 'state', 'city'])) {
$query->where($column, 'LIKE', '%'.$value.'%');
} else {
$query->where((string) $column, (string) $value);
}
}
return $query;
}
public function scopeOnlyNonBlockedUsers($query)
{
$blocked_user_ids = BlockUser::where('user_id', Auth::user()->id)
->pluck('blocked_user_id');
return $query->whereNotIn('user_id', $blocked_user_ids);
}
public function scopeGetNonExpiredItems($query)
{
return $query->where(function ($query) {
$query->where('expiry_date', '>', Carbon::now())->orWhereNull('expiry_date');
});
}
public function scopeIsJobCategory($query, $isJob = 1)
{
return $query->whereHas('category', function ($q) use ($isJob) {
$q->where('is_job_category', $isJob);
});
}
public function scopePriceOptional($query, $isJob = 1)
{
return $query->whereHas('category', function ($q) use ($isJob) {
$q->where('price_optional', $isJob);
});
}
public function getTranslatedNameAttribute()
{
$languageCode = request()->header('Content-Language') ?? app()->getLocale();
$language = Language::where('code', $languageCode)->first();
if ($language) {
$translations = $this->relationLoaded('translations') ? $this->translations : $this->translations()->get();
$translation = $translations->firstWhere('language_id', $language->id);
return $translation?->name ?? $this->name;
}
return $this->name;
}
public function getTranslatedDescriptionAttribute()
{
$languageCode = request()->header('Content-Language') ?? app()->getLocale();
$language = Language::where('code', $languageCode)->first();
if ($language) {
$translations = $this->relationLoaded('translations') ? $this->translations : $this->translations()->get();
$translation = $translations->firstWhere('language_id', $language->id);
return $translation?->description ?? $this->description;
}
return $this->description;
}
}