UsedByTeams Model Trait For Laravel Spark
Automatically limit your models to the current team
So you're using spark, and you have teams enabled. You start creating models and want to have them be team specific. Instead of writing, Model::where('team_id', auth()->user()->currentTeam->id)->get();
use this trait to add that behind the scenes so that every time you call on your model, it's assumed that you mean for the current team.
This assumes that the model has a team_id
, while it adds a scope of where team_id = currentTeam->id
.
Note: Implicit Route Model Binding in 5.2, auth session doesn't exist at the point of this trait causing issue. fixed in 5.3
Make a file, namespaced etc
Add use UsedByTeams
to your model
<?php
namespace App\Traits;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
trait UsedByTeams
{
protected static function boot()
{
parent::boot();
static::addGlobalScope('team', function(Builder $builder)
{
static::teamGuard();
$builder->where('team_id', auth()->user()->currentTeam->id);
});
static::saving(function (Model $model)
{
static::teamGuard();
if( ! isset($model->team_id))
{
$model->team_id = auth()->user()->currentTeam->id;
}
});
}
public function scopeAllTeams($query)
{
return $query->withoutGlobalScope('team');
}
public function team()
{
return $this->belongsTo('App\Team');
}
protected static function teamGuard()
{
if(auth()->guest() || ! auth()->user()->currentTeam)
{
throw new \Exception('No Auth User/Team');
}
}
}
<?php
namespace App;
use App\Traits\UsedByTeams;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
use UsedByTeams;
}
// gets current teams tasks
Task::all();
// automaticly adds current team_id
Task::create();
// gets all tasks / all teams globally
Task::allTeams()->get();
// get all tasks with task's team eagerloaded
Task::allTeams()->with('team')->get();
@tnorthcutt i think it's because when you do ajax it doesn't know that your are loggin.
In other words it can't read the session variable.
You need to pass the api_key or the internal TOKEN like vuejs do in spark kiosks