2 Foreach Loop Inside A Table - php

I had Users table and group table, when i load a group table, it loads the user which have same group_id as the group table id. it works, but my problem is the foreach was quite a mess. the output looks like this..
however, i want to make the output look like this.
here is my code..
<tbody>
<?php $i = 0; ?>
#foreach ($auser as $res)
<?php $i += 1; ?>
<tr #if($i%2==0) class="bgcolor" #endif>
<td>{{ $res->id }}.</td>
<td id="showdet">{{ $res->nama }}</td>
<td>{{ $res->description }}</td>
<?php $user = DB::table('users')->where('devgroup',$res->id)->get();?>
#foreach($user as $mem)
<td>{{ $mem->name }}</td>
#endforeach
<td>
<a class="default-btn" href="/pms/admin/group/edit/{{ $res->id }}">Edit</a>
<a type="submit" class="default-btn del" data-id="devgroup" href="#"{{ $res->id }}">Delete</a>
</td>
</tr>
#endforeach
</tbody>
what did i do wrong? thank you for your help.

You create new TD for each member. The nested foreach has to be:
<td>
#foreach($user as $mem)
{{ $mem->name }}<br>
#endforeach
</td>
The result will be:
<td>
Name 1<br>
Name 2<br>
Name 3<br>
</td>
I don't know the template engine you used, add inside a loop condition and don't put <br> after the last one member.

Related

ArgumentCountError Too few arguments to function Laravel unable to pull data from db and display

I am working in Laravel 7, pulling data from my db and showing the student his/her score on the scores page in percentage via the following codes.
In my StudentOperationController.php
public function show_result($id) {
$data['result_info'] = Oex_result::where('id', $id)->get()->first();
$data['student_info'] = Oex_students::select(['oex_students.*', 'oex_exam_masters.title', 'oex_exam_masters.exam_date'])->join('oex_exam_masters', 'oex_students.exam', '=', 'oex_exam_masters.id')->where('oex_students.id', Session::get('id'))->get()->first();
return view('student.show_result', $data);
}
and in my show_result.blade.php
<h2>Result Information</h2>
<table class="table">
<tr>
<td>Number Correct</td>
<td>{{ $result_info->yes_ans }}</td>
</tr>
<tr>
<td>Number Incorrect</td>
<td>{{ $result_info->no_ans }}</td>
</tr>
<tr>
<td>Total</td>
<td>{{ round($result_info->yes_ans / ($result_info->yes_ans + $result_info->no_ans) * 100 , 1) }} %</td>
</tr>
</table>
The reason I show this is that it works as expected. this is within the students dashboard. In my admin, I am trying to do the same thing and show that students data for his/her exam result. In my database, I have a json type data for example: {"2":"YES","3":"YES","8":"YES"}. I am still learning Laravel and am stuck on how to get this data to my admin. I am clearly doing something wrong and am in need of assistance. Here is what I have tried:
AdminController.php
public function manage_students($id)
{
$data['result_info'] = Oex_result::where('id', $id)->get()->first();
// dd($data);
$data['student_info'] = Oex_students::select(['oex_students.*', 'oex_exam_masters.title', 'oex_exam_masters.exam_date'])->join('oex_exam_masters', 'oex_students.exam', '=', 'oex_exam_masters.id')->where('oex_students.id', Session::get('id'))->get()->first();
$data['exams'] = Oex_exam_master::where('status', '1')->get()->toArray();
$data['students'] = Oex_students::select(['oex_students.*', 'oex_exam_masters.title as exam_name'])
->join('oex_exam_masters', 'oex_students.exam', '=', 'oex_exam_masters.id')
->get()->toArray();
return view('admin.manage_students', $data);
}
and in my manage_students.blade.php, I have
<tbody>
#foreach($students as $key => $student)
<tr>
<td>{{ $key+1 }}</td>
<td>{{ $student['name'] }}</td>
<td>{{ $student['email'] }}</td>
<td>{{ $student['mobile_no'] }}</td>
<td>{{ $student['exam_name'] }}</td>
{{-- <td>N/A</td> --}}
<td>{{ round($result_info->yes_ans / ($result_info->yes_ans + $result_info->no_ans) * 100 , 1) }} % </td>
#if($student['status']== 1)
<td><input data-id="{{ $student['id'] }}" class="student_status" type="checkbox" name="status" checked></td>
#else
<td><input data-id="{{ $student['id'] }}" class="student_status" type="checkbox" name="status"></td>
#endif
<td>
Edit
Delete
</td>
</tr>
#endforeach
</tbody>
In doing this I get the error Too Few arguments to function ... 0 passed and exactly 1 expected
I am unable to replicate what I have for the student dashboard and because of my lack of Laravel knowledge, I am having trouble solving this issue. So, any help would be greatly appreciated. If I am missing anything, please let me know so I can edit my question. Thanks in advance.
Edit: manage_students route:
Route::get('admin/manage_students', 'AdminController#manage_students');
Edit Number 2:
Too few arguments to function App\Http\Controllers\AdminController::manage_students(), 0 passed and exactly 1 expected
C:\laragon\www\lionsfieldtest\app\Http\Controllers\AdminController.php:146
Referring to this line:
public function manage_students($id)
Edit Number 3:
in resources/views/layouts/app.blade.php
<li class="nav-item">
<a href="{{ url('admin/manage_students') }}" class="nav-link">
<i class="nav-icon fas fa-school"></i>
<p>
Student Management
</p>
</a>
</li>
Edit number 4:
The manage_student page brings in data from a number of student's exam results
This function request $id;
public function manage_students($id)
This route doesn't pass one
Route::get('admin/manage_students', 'AdminController#manage_students');
As I can see you are filtering by results which in this case you need $result id
Route::get('admin/manage_student/{id}', 'AdminController#manage_students');
So you have to pass result ID, but lets assume there is a default results id
public function manage_students($id=2)
then this route works because $id is optional/predefined.
Route::get('admin/manage_students', 'AdminController#manage_students');
And if you pass an ID it will use
Route::get('admin/manage_student/{id}', 'AdminController#manage_students');
Make 2 routes and make parameter optional/predefined.
if you go to /admin/manage_student it will use ID 2
but if you pass /admin/manage_student/5 it will use 5

Bootstrap/Tempalte not working when nested foreach is inserted in View using Laravel

I have two tables in my program. The first one is tbfininst and the other is tbsubmission.
The tbfininst have a primary key of fld_code while the tbsubmission have a foreign key of CODCODE. It's a one to many relationship.
Now, I am displaying the rows of tbfininst in my blade.php. It looks like this.
Then, in the Submission (Periodicity) column, I want to insert how many rows from tbsumission does tbfininst have. By the way, the database is already created before I started. So I don't think I can use models or can i?
Anyways, in my controller, I tried using this code:
public function index()
{
$fininst = DB::connection('portaldb')->table('tbfininst')->groupBy('fld_code')->get();
$periodicity = DB::connection('portaldb')->table('tbsubmission')->select('CODCODE')->get();
return view('pages/compliance', ['fininst' => $fininst, 'periodicity' => $periodicity]);
}
and in my blade.php:
#foreach($fininst as $fin)
<tr>
<td>
<center>
{{ $fin->fld_code }}
</center>
</td>
<td>{{ $fin->fld_name }}</td>
<td>
#if ($fin->fld_status == 4)
<p>Compliant</p>
#else
<p>Non-Compliant</p>
#endif
</td>
<td>
#if ($fin->fld_ip || $fin->fld_twofactor)
<p>Compliant</p>
#else
<p>Non-Compliant</p>
#endif
</td>
<td>
#foreach($periodicity as $p)
#if ($fin->fld_code == $p->CODCODE)
{{$fin->fld_code}}
#else
#endif
#endforeach
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
#endforeach
When I inserted the #foreach of the periodicity, my blade.php output kinda not works.
I don't know why my template is not working. I just started using laravel two days ago and I'm still learning. I accept criticism, it will help me improved. Thank you.
You are just showing the matching values where you should be counting the matching values and showing them like this
#foreach($fininst as $fin)
#php $count = 0; #endphp
#foreach($periodicity as $p)
#if ($fin->fld_code == $p->CODCODE)
#php ++$count; #endphp
#else
#endif
#endforeach
<tr>
<td>
<center>
{{ $fin->fld_code }}
</center>
</td>
<td>{{ $fin->fld_name }}</td>
<td>
#if ($fin->fld_status == 4)
<p>Compliant</p>
#else
<p>Non-Compliant</p>
#endif
</td>
<td>
#if ($fin->fld_ip || $fin->fld_twofactor)
<p>Compliant</p>
#else
<p>Non-Compliant</p>
#endif
</td>
<td>
{{$count}}
</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
#endforeach

Foreach Loop Through Array for Datatables With Eloquent Relations

I have 2 tables in my database - Bots and Results. The bots table is to have information on each specific bot alone. Each bot should have several results attached to it. I will simplify what I have in my columns:
Bots Table
Device | Info1 | Info2 | Info3
Results Table
Device | Data1 | Data2 | Data3
As you can see, each table has the column named Device. Now, I have 2 Models of course for each table - the regarding info is as follows:
Bot Model
public function results()
{
return $this->hasMany('App\Result', 'device', 'device');
}
Result Model
public function bots()
{
return $this->belongsTo('App\Bot', 'device', 'device');
}
I have a view with a Datatable in it which I am trying to list every Device and Every Result corresponding to that Device. What I have here is an example of what was made before eloquent relations was brought in. I use to only have the Results table, so therefore it was farely simple to do a foreach and loop throught every result I had to display on the Datatabes
Datatables View
#foreach ($results as $result)
<tr>
<td>
{{ $result->device }}
</td>
<td>
{{ $result->info1 }}
</td>
<td>
{{ $result->info2 }}
</td>
<td>
{{ $result->info3 }}
</td>
<td>
{{ $result->data1 }}
</td>
<td>
{{ $result->data2 }}
</td>
<td>
{{ $result->data3 }}
</td>
</tr>
#endforeach
How can I get this to work now that the device name and information is actually stored in a separate table?
You can fetch your device information with its associated results using eager load like this
$bots = Bot::with('results')->get();
Now in view you can do it like this
#foreach ($bots as $bot)
<tr>
<td>
{{ $bot->device }}
</td>
<td>
{{ $bot->info1 }}
</td>
<td>
{{ $bot->info2 }}
</td>
<td>
{{ $bot->info3 }}
</td>
</tr>
#foreach ($bot->results as $result)
<tr>
<td>
{{ $result->data1 }}
</td>
<td>
{{ $result->data2 }}
</td>
<td colspan="2">
{{ $result->data3 }}
</td>
</tr>
#endforeach
#endforeach

PHP append a variable to the end of a string

So here I want to append the id of the currently logged in user to the name of a table, like for example Rating_User_1, but the 1 here comes from the id of the logged in user. I assigned the id of the logged in user to $id, as shown below in the code, and append it to the table column name, but this doesn't work. I tried echoing the $id by itself and it works (i.e. it spits out the id of the logged in user but that's not what I want), but when I try to append it to the string in order to "emulate" the table name it doesn't work. Any tips on workarounds?
#foreach($data as $data)
<tr>
<td> {{$loop->iteration}} </td> <!-- add number to the row -->
<td>
<a href="{{ Url('reply_thread') }}/{{ $data->id }}" class="text" >{{ $data->Judul }}</a>
</td>
<td><?php $id = Auth::user()->id;
echo $data->Rating_user_[$id]; ?> </td>
</tr>
#endforeach
My controller:
function threads() {
$data=Thread::all();
return view('thread.thread', ['data'=>$data]);
}
and some of the tables in the table Thread has columns named Rating_user_1, Rating_user_2, etc.
Variable expansion sometimes needs curly braces to function properly. The following should work:
echo $data->{'Rating_user_' . $id}
See Variable Parsing - Complex Syntax for info on "curly brace" variable expansion.
While it doesn't look like you need it here, Variable Variables may also be useful to read up on. (aka, $a = 'b'; $b = 'hello'; echo $$a; // Same as "echo $b", outputs 'hello')
You could try:
#foreach($data as $data)
<tr>
<td> {{$loop->iteration}} </td> <!-- add number to the row -->
<td>
<a href="{{ Url('reply_thread') }}/{{ $data->id }}" class="text" >
{{ $data->Judul }}
</a>
</td>
<td>{{ $data->{'Rating_user_' . $id} }}</td>
</tr>
#endforeach
You have multiple options to achieve this, the first would be to call the property/method with the name stored in a variable:
$tableName = 'Rating_user_' . $id;
$tableName = "Rating_user_$id";
$data->$tableName;
You could also use curly braces to make a hot concat on the property/method call itself as #romellem suggested:
$data->{'Rating_user_' . $id}
$data->{"Rating_user_$id"}
If you are going to access the $data->Rating_user more than once I would recommend you the first approach, if not the second one is okey aswell.
I think that your code is almost correct, and I think it's better if you use double curly than use echo like:
#foreach($data as $data)
<tr>
<td> {{$loop->iteration}} </td> <!-- add number to the row -->
<td>
<a href="{{ Url('reply_thread') }}/{{ $data->id }}" class="text" >{{ $data->Judul }}</a>
</td>
<td>{{ $data->{'Rating_user_' . Auth::id()} }}</td>
</tr>
#endforeach

Displaying multiple columns of data [from a PHP list] in a table in Laravel View

I currently am using a Laravel View with the following HTML that displays data onto a table using the <td> tag.
#if($unrostered)
<table class="table table-hover table-striped">
<thead>
<tr>
<th>#</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<?php $index = 1; ?>
#foreach($unrostered as $name => $profile)
<tr>
<td>
<?= $index; $index++; ?>
</td>
<td>
<a
href="{{ $profile }}">{{ $name }}
</a>
</td>
</tr>
#endforeach
</tbody>
</table>
#endif
I am currently just using one associative list called $unrostered which contains the key and value called name and profile. This shows two columns of data, like this:
As you can see, the name variable is the name of the person, and the profile is a URL that links to their profile.
My HTML skills aren't good. I want to pass in multiple lists [of the same length] into my HTML table, so each list occupies their own column.
I tried juggling the row and data tags, however, all I was able to achieve were that all the data points occupied only one row instead of columns.
Assume the name of your other lists are $list1, $list2, ... and they have the same format as your $unrostered. Then your foreach code should be changed to:
<?php $index = 1; ?>
#foreach($unrostered as $name => $profile)
<tr>
<td>
<?= $index; $index++; ?>
</td>
<td>
<a
href="{{ $profile }}">{{ $name }}
</a>
</td>
<td>
<a
href="{{ $list1[$name] }}">{{ $name }}
</a>
</td>
<td>
<a
href="{{ $list2[$name] }}">{{ $name }}
</a>
</td>
</tr>
#endforeach

Categories