1

I try to join duplicates value in array, but if joined array has different values, that should create another array automaticly.

this is my code, using query builder on laravel

DB::table('users')
    ->select(
        'users.id',
        'users.first_name',
        'users.last_name',
        'users.no_rekening',
        'users.empid',
        'users.no_rekening',
        'users.detail',
        'users.is_approve',
        'users.is_active',
        'karyawan_project.project_id',
        'project.nama as nama_project',
        'client.nama as nama_client'
    )->leftJoin(
        'karyawan_project',
        'users.id','=','karyawan_project.karyawan_id',
        'client.nama '
    )->join(
        'project',
        'karyawan_project.project_id','=','project.id'
    )->join('spk','project.spk_id','=','spk.id')
    ->join('client','spk.client_id','=','client.id')
    ->where('tipe', 2)
    ->whereIn('is_active', [1,0,2])
    ->orderBy('users.id')
    ->get();

and the result

1 => {#747 ▼
  +"id": 17
  +"first_name": "Dadan R"
  +"last_name": "Hadiansyah"
  +"no_rekening": "1150006713467"
  +"empid": "01180104"
  +"detail": ""
  +"is_approve": 1
  +"is_active": 1
  +"project_id": 4
  +"nama_project": "Driver Manager & Operasional"
  +"nama_client": "PT. TRANSPORTASI GAS INDONESIA"
}
2 => {#797 ▼
  +"id": 18
  +"first_name": "Setia"
  +"last_name": "Darma"
  +"no_rekening": "1150006713475"
  +"empid": "01180105"
  +"detail": null
  +"is_approve": 1
  +"is_active": 1
  +"project_id": 181
  +"nama_project": "Driver Operasional"
  +"nama_client": "PT. TRANSPORTASI GAS INDONESIA"
}
3 => {#790 ▼
  +"id": 18
  +"first_name": "Setia"
  +"last_name": "Darma"
  +"no_rekening": "1150006713475"
  +"empid": "01180105"
  +"detail": null
  +"is_approve": 1
  +"is_active": 1
  +"project_id": 4
  +"nama_project": "Driver Manager & Operasional"
  +"nama_client": "PT. TRANSPORTASI GAS INDONESIA"
}
4 => {#796 ▼
  +"id": 18
  +"first_name": "Setia"
  +"last_name": "Darma"
  +"no_rekening": "1150006713475"
  +"empid": "01180105"
  +"detail": null
  +"is_approve": 1
  +"is_active": 1
  +"project_id": 6
  +"nama_project": "PENGAMANAN STATION MBK"
  +"nama_client": "PT. PERMATA GRAHA NUSANTARA"
}
5 => {#757 ▼
  +"id": 19
  +"first_name": "Ardian"
  +"last_name": "Ismail"
  +"no_rekening": "1150004433837"
  +"empid": "01180106"
  +"detail": null
  +"is_approve": 1
  +"is_active": 0
  +"project_id": 4
  +"nama_project": "Driver Manager & Operasional"
  +"nama_client": "PT. TRANSPORTASI GAS INDONESIA"

the result has duplicate values where id = 18 and different nama_project

what I want is, id where has duplicate value join into one array and also nama_project with different value

like

1 => {#747 ▼
  +"id": 17
  +"first_name": "Dadan R"
  +"last_name": "Hadiansyah"
  +"no_rekening": "1150006713467"
  +"empid": "01180104"
  +"detail": ""
  +"is_approve": 1
  +"is_active": 1
  +"project_id": 4
  +"nama_project": "Driver Manager & Operasional"
  +"nama_client": "PT. TRANSPORTASI GAS INDONESIA"
}
2 => {#797 ▼
  +"id": 18
  +"first_name": "Setia"
  +"last_name": "Darma"
  +"no_rekening": "1150006713475"
  +"empid": "01180105"
  +"detail": null
  +"is_approve": 1
  +"is_active": 1
  +"project_id": 181
  +"nama_project": ▼{
                 +"Driver Operasional"
                 +"Driver Manager & Operasional"
                 +"PENGAMANAN STATION MBK"
               }
  +"nama_client": "PT. TRANSPORTASI GAS INDONESIA"
}

2 Answers 2

1

Since you have ordered the result by users.id. Let's assume you save the result in $users, then you could do something like:

$usersWithMergedProjects = [];
$previous_id = 0;
foreach($users as $user){
    if($user->id == $previous_id){
        array_push($usersWithMergedProjects[$user->id]->nama_projects, $user->nama_project);
    } else {
        $usersWithMergedProjects[$user->id] = $user;
        $usersWithMergedProjects[$user->id]->nama_projects = [];
        array_push($usersWithMergedProjects[$user->id]->nama_projects, $user->nama_project);

    }
    $previous_id = $user->id;
    unset($usersWithMergedProjects[$user->id]->nama_project);
}

note: If you got any error with this, please take a screenshot of the errors.

Sign up to request clarification or add additional context in comments.

6 Comments

thats not join an array
@dennisramli, I've edited my answer, let me know if you got any errors.
"array_push() expects parameter 1 to be array, null given"
which line @den?
array_push($userWithMergedProjects[$user->id]['nama_project'], $user->nama_project); this line I think $previous_id = $user->id; this code should be placed outside if else, but inside foreach
|
0

I've found the answer

$data = DB::table('users')
                  // ->with(['history'=>function($kar){
                  //             $kar->with('project.spk.client')->select('project_id','karyawan_id')->where('status',1);
                  //  }])
                        ->select('users.id','users.first_name','users.last_name','users.no_rekening','users.empid','users.no_rekening',
                                 'users.detail','users.is_approve','users.is_active','karyawan_project.project_id','karyawan_project.status',
                                 'project.nama as nama_project',
                                 'client.description as nama_client')
                        ->leftJoin('karyawan_project', 'users.id','=','karyawan_project.karyawan_id')
                        ->join('project','karyawan_project.project_id','=','project.id')
                        ->join('spk','project.spk_id','=','spk.id')
                        ->join('client','spk.client_id','=','client.id')
                        ->where('tipe', 2)->whereIn('is_active',[1,0,2])->orderBy('users.id')->get()
               ;

               $previous_id = 0;

               foreach($data as $key => $user){
                     $user->merged = [];
                     $user->project = '<b>'.$user->nama_client. '</b> ' . $user->nama_project;
                     if ($previous_id == $user->id) {

                           $minKey = $key-1;

                           if (!empty($data[$minKey]->merged)) {

                                 if ($user->status == 1) {
                                       array_push($user->merged, $user->project);
                                 }

                                    $user->merged = array_merge($user->merged, $data[$minKey]->merged);


                             }else {
                                   if ($user->status == 1) {
                                          array_push($user->merged, $user->project, $data[$minKey]->project);
                                   }

                            }
                       unset($data[$minKey]);

                       }else {
                               if ($user->status == 1) {
                                     array_push($user->merged,$user->project);
                               }
                       }
                       $previous_id = $user->id;
               }


            $data = $data->sortBy('first_name');   

1 Comment

this is the query what i want select us.id, us.first_name, us.last_name, group_concat(IF (kp.status = 1, CONCAT('<b>',c.description,'</b> - ',pr.nama), NULL) SEPARATOR ', ') as project from roles r left join role_user ru on ru.role_id=r.id left join users us on us.id = ru.user_id left join karyawan_project kp on us.id = kp.karyawan_id left join project pr on kp.project_id = pr.id left join spk spk on spk.id = pr.spk_id left join client c on c.id = spk.client_id WHERE r.name = 'karyawan' group by us.id ORDER BY us.id ASC

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.