2
votes

Say, I have 5 systems (lets call them that).

Each system has employees.

When employee from system #1 is logged in, I want to show him list of other employees working for system #1 only.

I wanted to use Global scope.

But I cannot find a way to inject system_id of logged in user.

I tried anonymous global scope - but static boot does cannot accept system_id:

    protected static function boot()
    {
        //this will not work, as scope method is static
        $userId = auth()->user()->system_id;

        parent::boot();
        static::addGlobalScope('thisSystemUser', function (Builder $builder) use($userId) {
            $builder->where('system_id', $userId);
        });
    }

I also tried global scope with separate class - same problem:


namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class SystemEmployeeScope implements Scope
{

    /**
    * Apply the scope to a given Eloquent query builder.
    *
    * @param  \Illuminate\Database\Eloquent\Builder  $builder
    * @param  \Illuminate\Database\Eloquent\Model  $model
    * @return void
    */
    public function apply(Builder $builder, Model $model)
    {

        // no luck here as well
        $userId = auth()->user()->system_id;

        /**
         * appended query constraint for this scope
         */
        $builder->where('system_id', $userId);
    }


}

I tried using $model - to no avail. It returns empty model. Any attempts to get some data via $model also tanked.

I do not want to use local scope, or dynamic scope, as they are not what I want to accomplish and there are better ways, that using these in my case, e.g.: condition directly on relationship - in my case many-to-many.

Is there any way, I am unaware of and not too overly complex to cram that system_id into scope?

1
Which version of Laravel you are using?Gautam Patadiya
Sorry for being late - different time zone and TGIF :) L5.6Jeffz

1 Answers

3
votes

You can do it like this.

namespace App\Scopes;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class SystemEmployeeScope implements Scope
{

    private $user;

    public function __construct()
    {
        $this->user = auth()->user();
    }

    public function apply(Builder $builder, Model $model)
    {
        $userId = $this->user->id
        $builder->where('system_id', $userId);
    }
}