User.php 4.57 KB
<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use JsonException;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */

    protected $fillable = [
        'name',
        'email',
        'password',
        'admin',
        'telephone',
        'surname',
        'name_man',
        'surname2',
        'is_worker',
        'is_lookin',
        'is_message',
        'is_public',
        'is_worker',
        'is_remove',
        'is_ban',
        'is_new',
        'is_bd',
        'email_verified_at',
        'created_at',
        'updated_at',
        'birthday',
        'file',
        'pubpassword',
        'is_manager',
        'subscribe_email',
        'subscribe',
        'autoresponder',
        'autoresponder_message',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /*
    * Связь Пользователей системы с работодателями
     * users - employers
    */
    public function employers(): HasMany
    {
        return $this->hasMany(Employer::class, 'user_id');
    }

    /*
     * Связь Пользователей системы с работниками
     * users - workers
    */
    public function workers() {
        return $this->hasMany(Worker::class, 'user_id');
    }

    /*
        * Связь Пользователей системы с работниками
        * users - workers
    */
    public function work() {
        return $this->hasMany(Worker::class, 'user_id')
            ->select('telephone', 'email', 'position_work', 'persent_anketa');
    }

    /*
      * Связь Модели Пользователей(Users) с Группами (Group_users)
      * users - group_users
        многие-ко-многим
   */
    public function ingroup() {
        return $this->belongsToMany(Group_user::class, 'group_works');
    }

    /*
     * Связь Пользователей системы с ссобщениями
     * users - messages
    */
    public function messages() {
        return $this->hasMany(Message::class);
    }

    /*
     * Связь Пользователей системы с статистика
     * users - static_workers
    */
    public function static_user() {
        return $this->hasMany(Static_worker::class);
    }

    /*
    * Связь модели Юзеры (users) с моделью Группы пользователей (Group_works)
        один-ко-многим
    */
    public function peoples() {
        return $this->hasMany(Group_works::class);
    }

    /*
    * Связь Модели Пользователей(Users) с Группами (Group_users)
    * users - group_users
        многие-ко-многим
    */
    public function jobtitles() {
        return $this->belongsToMany(Job_title::class, 'workers', 'user_id', 'position_work');
    }

    public function scopeActive($query) {
        return $query->where('is_remove', '=', '0');
    }

    public function scopeWorker($query) {
        return $query->where('is_worker', '=', '1');
    }

    public function scopeBaseuser($query) {
        return $query->where('is_bd', '=', '1');
    }

    public function scopeRealuser($query) {
        return $query->where('is_bd', '=', '0');
    }

    public function scopeAdmin($query) {
        return $query->where('admin', '=', '1');
    }

    public function scopeNotadmin($query) {
        return $query->where('admin', '=', '0');
    }

    /**
     * @throws JsonException
     */
    public function getJobAttribute(): ?string
    {
        $positions = $this->workers[0]?->positions_work;
        if (is_string($positions)) {
            $jobIds = json_decode($positions, true, 512, JSON_THROW_ON_ERROR);
        } else {
            $jobIds = $positions;
        }

        if ($jobIds !== null && count($jobIds) > 0) {
            return Job_title::whereIn('id', $jobIds)->first()?->name;
        }
        return null;
    }

}