public function scopeFilter(Builder $query, array $attributes): Builder
{
$query->leftJoin('authority_change_status_types', function ($q) {
$q->on('authority_changes.authority_change_status_type_id', '=', 'authority_change_status_types.id');
})
->leftJoin('authority_change_document_sending_types', function ($q) {
$q->on('authority_change_document_sending_types.id', '=', 'authority_changes.authority_change_document_sending_type_id');
})
->leftJoin('authority_change_documents', function ($q) {
$q->on('authority_changes.id', '=', 'authority_change_documents.authority_change_id');
})
->leftJoin('cloudfiles', function ($q) {
$q->on('cloudfiles.id', '=', 'authority_change_documents.cloudfile_id');
})
->leftJoin('users', function ($q) {
$q->on('authority_changes.user_id', '=', 'users.id');
});
if (isset($attributes['quickSearch'])) {
$searchTerm = $attributes['quickSearch'];
$query->where('request_change_firstname', 'ilike', '%' . $searchTerm . '%')
->orWhere('request_change_lastname', 'ilike', '%' . $searchTerm . '%')
->orWhere('request_change_mail', 'ilike', '%' . $searchTerm . '%')
->orWhere('request_change_mobilephone', 'ilike', '%' . $searchTerm . '%')
->orWhere('request_change_position', 'ilike', '%' . $searchTerm . '%')
->orWhere('description', 'ilike', '%' . $searchTerm . '%')
->orWhere('users.username', 'ilike', '%' . $searchTerm . '%');
} else {
if (isset($attributes['user_id'])) {
$query->where('user_id', $attributes['user_id']);
}
if (isset($attributes['username_id'])) {
$query->where('users.id', $attributes['username_id']);
}
if (isset($attributes['status_type_id'])) {
$query->where('authority_changes.authority_change_status_type_id', $attributes['status_type_id']);
}
if (isset($attributes['start_date'])) {
$start = Carbon::parse($attributes['start_date']);
$query->where('authority_changes.created_at', '>=', $start->format('Y-m-d'));
}
if (isset($attributes['end_date'])) {
$end = Carbon::parse($attributes['end_date']);
$query->where('authority_changes.created_at', '<=', $end->format('Y-m-d'));
}
}
return $query;
}
joinleri AuthorityChange.php'de scopeFilter içerisinde tanımladım.
public function all(?array $attributes)
{
$dataPerPage = 20;
if (isset($attributes['dataPerPage']) && is_int($attributes['dataPerPage'])) {
$dataPerPage = $attributes['dataPerPage'];
}
return $this->model->filter($attributes)->select(
"authority_changes.user_id",
"users.username",
"authority_changes.id as degisiklik_talebi_id",
"authority_change_status_types.id as status_type_id",
"authority_change_status_types.name as status_type_name",
"authority_change_document_sending_types.id as sending_type_id",
"authority_change_document_sending_types.name as sending_type_name",
"request_change_firstname",
"request_change_lastname",
"request_change_mail",
"request_change_mobilephone",
"request_change_position",
"description",
"authority_changes.created_at",
"authority_changes.updated_at",
"authority_changes.sending_date",
"cloudfiles.file_url"
)
// ->groupBy('degisiklik_talebi_id')
// ->groupBy("authority_change_status_types.id")
// ->groupBy("authority_change_document_sending_types.id")
// ->groupBy("cloudfiles.id")
// ->groupBy("users.id")
->orderBy('status_type_id', 'asc')
->orderBy('created_at', 'asc')
->paginate($dataPerPage);
}
AuthorityChangeRepository.php içerisinde de yukarıdaki fonksiyon aracılığıyla çağırıyorum. Fakat aynı "degisiklik_talebi_id" ye sahip 3 tane row dönüyor. Sorunun kaynağı leftJoin kullanımından kaynaklı tableların kartezyenlerinin dönmesi. Fakat nasıl çözüme ulaşacağımı bulamadım. Öneriye ihtiyacım var.