Ben sadece aktif kullanıcılarla çalışmamı sağlayan bir global scope örneği hazırladım. mevlut44 arkadaşımızın da isteğine uygun.
Henüz daha karar vermedim ama global scope için
app/scopes gibi bir klasörü uygun gördüm.
composer.json dosyama ekledim:
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/scopes",
"app/tests/TestCase.php"
]
Kullanıcı tablomda status sütunu var. 1 ise kullanıcı aktif; 0 ise kullanıcı pasif. Kullanıcı işlemleri ile uğraşırken sadece aktif kullanıcılarla uğraşmak istiyorum. O yüzden
Users modelinde tüm sorgulara
where('status',1) şeklinde bir şart eklemek istiyorum
app/scopes/OnlyActiveUsersScope.php:
<?php
use Illuminate\Database\Eloquent\ScopeInterface;
use Illuminate\Database\Eloquent\Builder;
class OnlyActiveUsersScope implements ScopeInterface {
public function apply(Builder $builder)
{
$builder->where('status',1);
}
public function remove(Builder $builder)
{
$query = $builder->getQuery();
foreach ((array) $query->wheres as $key => $where)
{
if ($this->isOnlyActiveUsersScopeConstraint($where, 'status'))
{
unset($query->wheres[$key]);
$query->wheres = array_values($query->wheres);
}
}
}
protected function isOnlyActiveUsersScopeConstraint(array $where, $column)
{
return $where['type'] == 'Basic' && $where['column'] == $column;
}
}
trait OnlyActiveUsersTrait {
public static function bootOnlyActiveUsersTrait()
{
static::addGlobalScope(new OnlyActiveUsersScope);
}
}
Daha sonra OnlyActiveUsersTrait traitini kullanmak için models/User.php dosyama ekliyorum
use UserTrait, RemindableTrait, OnlyActiveUsersTrait;
Basit bir şekilde kullanıcıları aldığımda sorgu şu şekilde değişiyor:
$users = User::all();
print_r(DB::getQueryLog());
Array
(
[0] => Array
(
[query] => select * from `users` where `status` = ?
[bindings] => Array
(
[0] => 1
)
[time] => 0.55
)
)
Umarım işinize yarar.
Edit: Biraz geç kaldım anlaşılan