Сортировка списка пользователей в Laravel 5.8 - PullRequest
1 голос
/ 07 июня 2019

Я новичок в Laravel.Я использую Laravel 5.8 в своем проекте.

У меня есть этот код:

Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('company_id')->unsigned();
            $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade');
            $table->boolean('enable')->default(0);
            $table->string('name', 120)->nullable();
            $table->string('surname', 120)->nullable();
            $table->string('email', 120)->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->bigInteger('counter')->default(0);
            $table->string('url_address', 160);
            $table->string('account_paid_for', 12)->nullable();
            $table->string('premium_for', 12)->nullable();
            $table->string('hits', 12)->nullable();
            $table->rememberToken();
            $table->timestamps();
            $table->engine = "InnoDB";
        });


public function getUserList(string $query, string $sortColumn, string $sortMethod)
    {
        if ($query != "") {
            return User::ofRoleType(['user', 'userPremium', 'userCompany', 'userSponsor', 'userGuest'])
                ->where(function ($q) use ($query, $sortColumn, $sortMethod) {
                    $q->where('email', 'LIKE', '%' . $query . '%')
                        ->orWhere('id', 'LIKE', '%' . $query . '%')
                        ->orWhere('name', 'LIKE', '%' . $query . '%')
                        ->orWhere('surname', 'LIKE', '%' . $query . '%')
                        ->orderBy($sortColumn, $sortMethod);
                })->paginate(2);
        } else {
            return User::ofRoleType(['user', 'userPremium', 'userCompany', 'userSponsor', 'userGuest'])->paginate(2);

        }
    }

и модель пользователя:

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;
    use cms\Presenters\UserPresenter;

    public static $roles = [];


    protected $fillable = ['name', 'surname', 'email', 'email_verified_at', 'password', ];

    protected $hidden = [
        'password', 'remember_token',
    ];


    public function roles()
    {
        return $this->belongsToMany('App\Role');
    }

    public function mainRole()
    {
        return $this->hasOne('App\Role');
    }


    public function hasRole(array $roles)
    {

        foreach ($roles as $role) {

            if (isset(self::$roles[$role])) {
                if (self::$roles[$role]) return true;

            } else {
                self::$roles[$role] = $this->roles()->where('name', $role)->exists();
                if (self::$roles[$role]) return true;
            }

        }
        return false;
    }

}

Мне нужно отобразить список пользователей вв следующем порядке:

  1. Сначала пользователи, имеющие премиум-аккаунт (т. е. поле premium_for с большей датой, чем сегодня),

  2. Затемпользователи с наибольшим числом в поле «хиты»

  3. другие пользователи

Как это сделать?Кто-нибудь знает, как настроить мою функцию getUserList для этого вида?

1 Ответ

4 голосов
/ 07 июня 2019

Мне не хватает опыта Laravel, но я думаю, что вы просите:

->orderBy(DB::raw('IF(premium_for > CURDATE(), 0, 1)'))
->orderBy('hits', 'DESC');

(не проверено) Это означает, что:

  1. Приоритет для всех, у кого в будущем срок действия премиум-статуса. (Не важно сколько в будущем.)
  2. Затем сортируйте по хитам - от самых больших до самых маленьких.

Ресурс, объясняющий DB::raw(): https://laraveldaily.com/select-with-dbraw-make-your-database-work/

Я также порекомендую вам WS_CONCAT() свои столбцы WHERE и проведите только одно сравнение LIKE. Например: Предложение «Где как», использующее объединенное значение из 2 столбцов с красноречивым

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...