Laravel view, sort based on two criteria - php

I am trying to order the out but based on two criteria's, the dawn one should come at the top and then the up and last the no active once. I am trying to do it in the view in laravel. this is my code. it is able to sort them based on up or dawn but not on active.
#foreach($notes->sortBy('values') as $notification)
<tbody>
<tr>
<td> {{ $notification->website_url }} </td>
#if($notification->status('health') == 'up')
<td> {{ $notification->status('health') }} <span class="up"></span></td>
#else
<td> {{ $notification->status('health') }} <span class="down"></span></td>
#endif
<td> </td>
<td class="<?php echo $notification->active == 1 ? 'active' : '' ?>">
{{ $notification->active == 1 ? 'Yes' : 'No' }}
</td>
<td>
<a href="{{ route('notifications.edit', [$notification->id]) }}">
<input type="submit" name="showmore" value="show more"/>
</a>
</td>
<td></td>
</tr>
</tbody>
#endforeach

Argument of sortBy() method can be actually a function, so you can use custom value as a sort criteria. Preferably in the Controller.
$notes = $notes->sortBy(function ($note) {
return ($note->active ? '0' : '1') . ($note->status('health') == 'down' ? '0' : '1');
});
And $notes will be sorted by this value in the following order:
00 for down active
01 for up active
10 for down not active
11 for up not active
To be sincere though I'm not really sure if I understand what order you want to achieve. If that is the case just adjust the return value of sorting function.

Related

Two links appears for one user weirdly - Laravel models

I have a many-to-many relationship between my User and Wallet models.
Wallet Model
public function users()
{
return $this->belongsToMany(User::class, 'user_wallet', 'user_id', 'wallet_id');
}
User Model
public function wallets()
{
return $this->belongsToMany(Wallet::class, 'user_wallet', 'user_id', 'wallet_id')->withPivot('balance');;
}
Then in my Blade file, I tried the following.
#forelse($user->wallets as $wallet)
<tr>
<td>
{{ $wallet->name }}
</td>
<td>
{{ $wallet->pivot->balance }}
</td>
<td>
<a href="{{ route('user.WalletTransaction', ['walletId'=>$wallet->id,'userId'=>$user->id]) }}" class="fa fa-exchange text-dark mt-1" />
</td>
</tr>
#empty
<td colspan="5" class="text-center">No wallet exist</td>
#endforelse
It works fine, but the problem is, it shows two links in the table for one user. However, it should be showing one.
And if I do:
#forelse($user->wallets as $wallet)
{{ count(array($user)) }}
#empty
<td colspan="5" class="text-center">
No wallet exist
</td>
#endforelse
The result would be 1.
The problem is coming from 'userId' => $user->id of the link. Because if I remove it, only 1 link would appear, which is correct. But still, I do need the userId and don't know how to pass that into the route name.
So what's going wrong here? I need one link for each user, and I don't know why it prints two of them.
#forelse($user->wallets as $wallet)
<tr>
<td>
{{ $wallet->name }}
</td>
<td>
{{ $wallet->pivot->balance }}
</td>
<td>
<a href="{{ route('user.WalletTransaction', ['walletId'=>$wallet->id,'userId'=>$user->id]) }}" class="fa fa-exchange text-dark mt-1" />
</td>
</tr>
#empty
<td colspan="5" class="text-center">No wallet exist</td>
#endforelse`
Doesn't $user->wallets returns collection of all wallets associated with each user?
maybe you need to check if any user has more than one wallet or if you want to show only one you can user $user->wallets[0] to show the first wallet model since its a collection

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

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

Laravel check if a specific item is present in a table

I have the following relationships
a movie has many episodes
an user has a watchlist
a watchlist has many movies
I get my episodes with eloquent
$latestshows = episode::with('movies') ->where('category', 'tvshow')->take(10) ->get();
I then display it with
#foreach($latestshows as $show)
#if (Auth::guest())
<tr>
#else
<tr class="{{ Auth::user()-> watchlist **...** ? 'alert-danger' : '' }}">
#endif
<td>{{ $show->movie->title }}</td>
<td>{{ $show->number }}</td>
<td>{{ $show->created_at }}</td>
</tr>
#endforeach
How do I check if the logged in used has the show in watchlist? I want to display it with a different color in that case.
Sorry if this is a silly question, I'm just a beginner and experimenting.
You can use in_array or array_diff (Both native PHP functions) to see which movies are the same, or you can use the ->diff() or ->has() methods from the Collection objects that you are dealing with.
<td>
<a ... {{ Auth::user()->watchlist->movies->find($show->movies->id) ? 'alert-danger' : '' }}>
{{ $show->movie->title }}
</a>
</td>
This code gave me the expected result
{{ Auth::user()->watchlist->movies->find($show->movies->id) ? 'alert-danger' : '' }}
Thank you Oscar, you were my inspiration :P

2 Foreach Loop Inside A Table

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.

Categories