Laravel Query Search Function

Viewed 39

This is my controller:

public function index($mid,$payload){

    $search = $payload['search'];

    $users = DB::select('SELECT a.id, a.alternate_id, a.setujuterma, a.mykad, a.nama, a.email, a.notel, a.etunai,
                       b.ranktitle, c.ranktitle AS appointed_rank, d.nama as hirarki, e.alternate_id as placement,
                       e.nama as leadername, a.akses, a.suspendreason, a.regstamp,
                       a.matagajet, f.display as hirarkidisplay, IF(a.mykadverify = "3","1","0") as mykadverifydecode
                       FROM pengguna as a
                       LEFT JOIN penggunarank b ON a.effective_rank = b.id
                       LEFT JOIN penggunarank c ON a.appointed_rank = c.id
                       LEFT JOIN hirarki d ON a.userrank = d.id
                       LEFT JOIN pengguna e ON a.placement = e.id
                       LEFT JOIN hirarkimid f ON a.userrank = f.hirarki AND a.mid = f.mid
                       WHERE a.mid ='. $mid .' AND a.akses != -1'
                       );

    $sortUser = collect($users)->sortByDesc('alternate_id')->toArray();
    $collection = collect($sortUser);

    $count = count($users);

    // SEARCH BOX
    if ($search) {
        $collection->where(function ($q) use ($search) {
            $q->where("alternate_id","LIKE","%{$search}%")
            ->orWhere("nama","LIKE","%{$search}%")
            ->orWhere("mykad","LIKE","%{$search}%")
            ->orWhere("notel","LIKE","%{$search}%")
            ->orWhere("email","LIKE","%{$search}%");
        });
    }

    return [
        $user,
        $count
    ];
}

So,

  1. $users return an array.
  2. $collection return collection

for the search box, if I use $users, I get error

"Call to a member function where() on Array"

and if I use $collection, I get

message: "explode() expects parameter 2 to be string, object given", exception: "ErrorException",…}

Any help would be greatly appreciated. Thanks.

2 Answers
 public function search(Request $payload){

        $search = $payload['search'];

        if($search == "")
        {
            $users = Payee::whereNotNull('payee_name')->take(10)->get();
        }
        else
        {
            $users = Payee::whereNotNull('payee_name')
                ->where(function ($q) use ($search) {
                    $q->where("payee_name","LIKE","%$search%")
                    ->orWhere("payee_nick_name","LIKE","%$search%");
                })->take(10)->get();
        }

        return [
            $users,
        ];
    }

I found an answer to my question. All I need is to change the query into eloquent model class. There is no other way if I want to use the where() function for my search. First I create model User.php:

<?php

namespace App;

use App\WithdrawEcash;
use Laravel\Sanctum\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Propaganistas\LaravelPhone\PhoneNumber;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;

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

    protected $table = 'pengguna';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = ['id'];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

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

    // user registered by
    public function userRegby()
    {
        return $this->belongsTo(User::class, 'regby');
    }

    // user leader
    public function userPlacement()
    {
        return $this->belongsTo(User::class, 'placement');
    }

    public function penggunaRank()
    {
        return $this->belongsTo(PenggunaRank::class, 'effective_rank');
    }

    public function appointedRankUser()
    {
        return $this->belongsTo(PenggunaRank::class, 'appointed_rank');
    }

    public function penyatabonus()
    {
        return $this->belongsTo(User::class, 'id', 'pengguna');
    }

    //Hirarkimid userrank
    public function userHirarki()
    {
        return $this->belongsTo(Hirarkimid::class, 'userrank', 'hirarki');
    }

    public function userhirarchy()
    {
        return $this->belongsTo(Hierarchy::class, 'userrank')->select('id', 'nama');
    }

    public function systemHirarki()
    {
        return $this->belongsTo(Hierarchy::class, 'userrank');
    }

    // user order
    public function userOrders()
    {
        return $this->hasMany(Order::class, 'pengguna');
    }

    // user order for registration report
    public function userOrder()
    {
        return $this->hasOne(Order::class, 'pengguna');
    }

    public function hierarchy()
    {
        $hirarki = $this->belongsTo(Hirarkimid::class, 'userrank', 'hirarki')
            ->select('hirarki', 'display', 'shownilaibelian', 'show_harga_ketika_pesanan')
            ->where('mid', auth()->user()->mid);
        if ($hirarki) {
            return $hirarki;
        } else {
            return $this->belongsTo(Hierarchy::class, 'userrank')->select('id', 'nama');
        }
    }

    public function myCartLists()
    {
        return $this->hasMany(AddToCart::class, 'user_id');
    }

    public function bonusStatement()
    {
        return $this->hasMany(PenyataBonus::class, 'pengguna');
    }

    public function currentBonusStatement()
    {
        return $this->hasMany(PenyataBulanSemasa::class, 'pengguna');
    }

    public function withdrawEcash()
    {
        return $this->hasMany(WithdrawEcash::class, 'pengguna');
    }

    public function fileupload()
    {
        return $this->morphOne(FileUpload::class, 'file_upload');
    }

    public function fileuploads()
    {
        return $this->morphMany(FileUpload::class, 'file_upload');
    }

    public function voucherdetail()
    {
        return $this->hasMany(Voucherdetail::class, 'pengguna');
    }

    public function countryCode()
    {
        return $this->hasOne(Negara::class, 'nama', 'negara')->value('kod');
    }

    public function setNotelAttribute($value)
    {
        if (!is_null($value)) {
            $country_code = $this->countryCode() != '' ? $this->countryCode() : 'MY';
            $this->attributes['notel'] = PhoneNumber::make($value, $country_code)
                ->formatForMobileDialingInCountry($country_code);
        } else
            $this->attributes['notel'] = $value;
    }

    public function setNotelcsAttribute($value)
    {

        if (!is_null($value)) {
            $country_code = $this->countryCode() != '' ? $this->countryCode() : 'MY';
            $this->attributes['notelcs'] =  PhoneNumber::make($value, $country_code)
                ->formatForMobileDialingInCountry($country_code);
        } else
            $this->attributes['notelcs'] = $value;
    }
}

And in my controller I simply call the user model:

$user = User::query()->select('id', 'alternate_id', 'setujuterma', 'mykad', 'nama', 'email', 'notel', 'etunai',
                            'effective_rank','appointed_rank', 'akses', 'suspendreason', 'regstamp',
                            'matagajet', 'userrank','mykadverify','placement')
                    ->with([
                        'penggunaRank'  => function($q) use ($mid){
                            $q->select('id','ranktitle')->where('mid',$mid);
                        },
                        'appointedRankUser' => function($q) use ($mid){
                            $q->select('id','ranktitle')->where('mid',$mid);
                        },
                        'systemHirarki'=> function($q){
                            $q->select('id', 'nama');
                        },
                        'userHirarki'  => function($q) use ($mid){
                            $q->select('hirarki','display')->where('mid',$mid);
                        },
                        'userPlacement' => function($q){
                            $q->select('id','alternate_id','nama');
                        }

                    ])
                    ->where('mid',$mid)
                    ->where('akses','!=',-1);

        if ($search) {
            $user->where(function($q) use ($search){
                $q->where("alternate_id","LIKE","%{$search}%")
                ->orWhere("nama","LIKE","%{$search}%")
                ->orWhere("mykad","LIKE","%{$search}%")
                ->orWhere("notel","LIKE","%{$search}%")
                ->orWhere("email","LIKE","%{$search}%");
            });
        }

        return $user->orderBy('alternate_id','desc')

Hope everyone can get benefits from this. Thank you.

Related