Why does /user/{username} not show up automatically? - php

My route:
Route::get('/user/{username}', [
'uses' => '\MostWanted\Http\Controllers\ProfileController#getProfile',
'as' => 'profile.index',
]);`
My Controller:
use MostWanted\Models\User;
use Illuminate\Http\Request;
class ProfileController extends Controller{
public function getProfile($username){
$user = User::where('username', $username)->first();
if (!$user) {
abort(404);
}
return view('profile.index')
->with('user', $user);
}
}
The username field in the database exists and is filled in. When I go into search, the users pop up but the URL always misses out on the {username}. When I manually enter the {username} e.g. mostwanted.dev:8000/user/yes.man, it functions normally.
EDIT: This is the view that is hooked to (userblock.blade.php)
<div class="media">
<a class="pull-left" href="{{ route('profile.index', ['username' => $user->username]) }}">
<img class="media-object" alt="{{ $user->getNameOrUsername() }}" src="">
</a>
<div class="media-body">
<h4 class="media-heading">
{{ $user->getNameOrUsername() }}
</h4>
#if ($user->location)
<p>{{ $user->location }}</p>
#endif
</div>
Here is the User.php:
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
protected $table = 'users';
protected $fillable = [
'username',
'first_name',
'last_name',
'email',
'password',
'location',
'gender',
'date_of_birth',
];
protected $hidden = [
'password',
'remember_token',
];
public function getName()
{
if ($this->first_name && $this->last_name) {
return "{$this->first_name} {$this->last_name}";
}
if ($this->first_name) {
return $this->first_name;
}
return null;
}
public function getUsername()
{
if ($this->first_name && $this->last_name) {
return "{$this->first_name}.{$this->last_name}";
}
if ($this->first_name) {
return $this->first_name;
}
return null;
}
public function getNameOrUsername()
{
return $this->getName() ?: $this->username;
}
public function getUsernameOrName()
{
return $this->getUsername() ?: $this->username;
}
public function getFirstNameOrUsername()
{
return $this->first_name ?: $this->username;
}
}
EDIT**: Search results view:
#extends('templates.default')
#section('content')
<h3>Your search for "{{ Request::input('query') }}"</h3>
#if (!$users->count())
<p>No results found.</p>
#else
<div class="row">
<div class="col-lg-12" style="padding: 50px;">
#foreach ($users as $user)
#include('user/partials/userblock')
#endforeach
</div>
</div>
#endif
#stop
SearchController:
use DB;
use MostWanted\Models\User;
use Illuminate\Http\Request;
class SearchController extends Controller
{
public function getResults(Request $request)
{
$query = $request->input('query');
if (!$query) {
return redirect()->route('home');
}
$users = User::where(DB::raw("CONCAT(first_name, ' ', last_name)"),
'LIKE', "%{$query}%")
->orWhere('username', 'LIKE', "%{query}%")
->get();
return view('search.results')->with('users', $users);
}
}
EDIT***:
ProfileController:
use MostWanted\Models\User;
use Illuminate\Http\Request;
class ProfileController extends Controller
{
public function getProfile($username)
{
$user = User::where('username', $username)->first();
if (!$user) {
abort(404);
}
return view('profile.index')
->with('user', $user);
}
}

Try to modify userblock.blade.php
<div class="media">
<a class="pull-left" href="{{ url('user/'.$user->username) }}">
<img class="media-object" alt="{{ $user->getNameOrUsername() }}" src="">
</a>
<div class="media-body">
<h4 class="media-heading">
{{ $user->getNameOrUsername() }}
</h4>
#if ($user->location)
<p>{{ $user->location }}</p>
#endif
</div>

Related

My variable in Controller is not loaded to blade

Question
Why my variable in ProfileController is not loaded in my blade(index2.blade.php)?
Error Message
Undefined variable: plus (View: /work/resources/views/stories/index2.blade.php)
My Codes
routes/web.php
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('login');
Route::match(['get','post','middleweare'=>'auth'], '/',
'StoriesController#index',
'StoriesController#store',
'ProfileController#index',
'ProfileController#store'
);
Route::match(['get','post','middleweare'=>'auth'], 'stories/create',
'StoriesController#add',
'StoriesController#upload'
);
Route::match(['get','post','middleweare'=>'auth'], 'profile/create',
'ProfileController#add',
'ProfileController#upload'
);
Route::group(['middleweare' => 'auth','name'=>'profile'], function () {
Route::get('/profile/edit', 'ProfileController#edit');
});
Route::get('/home', 'HomeController#index')->name('home');
Auth::routes();
app/Http/Controllers/ProfileController
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\stories;
use App\History;
use App\Posts;
use Carbon\Carbon;
use Storage;
class ProfileController extends Controller
{
public function index(Request $request)
{
$plus = Posts::all();
return view('stories.index2', compact('plus'));
}
public function upload(Request $request)
{
$this->validate($request, [
'file' => [
'required',
'file',
'image',
'mimes:jpeg,png',
]
]);
if ($request->file('file')->isValid([])) {
$path = $request->file->store('public');
return view('stories.index2')->with('filename', basename($path));
} else {
return redirect()
->back()
->withInput()
->withErrors();
}
}
public function store(Request $request)
{
$d = new \DateTime();
$d->setTimeZone(new \DateTimeZone('Asia/Tokyo'));
$dir = $d->format('Y/m');
$path = sprintf('public/posts/%s', $dir);
$data = $request->except('_token');
foreach ($data['plus'] as $k => $v) {
$filename = '';
$posts = Posts::take(1)->orderBy('id', 'desc')->get();
foreach ($posts as $post) {
$filename = $post->id + 1 . '_' . $v->getClientOriginalName();
}
unset($post);
if ($filename == false) {
$filename = 1 . '_' . $v->getClientOriginalName();
}
$v->storeAs($path, $filename);
$post_data = [
'path' => sprintf('posts/%s/', $dir),
'name' => $filename
];
$a = new Posts();
$a->fill($post_data)->save();
}
unset($k, $v);
return redirect('/');
}
public function create(Request $request)
{
$this->validate($request, Profile::$rules);
$profile = new Profile;
$form = $request->all();
unset($form['_token']);
$profile->fill($form);
$profile->save();
return redirect('/');
}
public function add()
{
return view('profile.create2');
}
public function edit()
{
return view('profile.edit');
}
}
resources/views/stories/index2.blade.php
#extends('layouts.front2')
#section('title','mainpage')
#section('content')
<div class="profile">
<div class="profileimg">
#foreach ($plus as $pplus)
<img src="/storage/{{ $pplus->path . $pplus->name }}" style="height: 210px; width: 210px; border-radius: 50%;">
#endforeach
</div>
<div class="name">
#guest
<a class="nav-link2" href="{{ route('register')}}">{{ __('Create Accout!')}}</a>
#else
<a id="navbarDropdown" class="nav-link2" href="#" role="button">
{{Auth::user()->name}}<span class="caret"></span></a>
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">
#csrf
</form>
</div>
#endguest
<div class="aboutme">
You can write your profile here!You can write your profile here!You can write your profile here!
You can write your profile here!You can write your profile here!You can write your profile here!
You can write your profile here!You can write your profile here!You can write your profile here!
You can write your profile here!You can write your profile here!You can write your profile here!
You can write your profile here!You can write your profile here!You can write your profile here!
</div>
</div>
<div class="new">
<div class="newtitle">
<h1>New</h1>
</div>
<div class="container1">
#foreach ($plus as $pplus)
<img src="/storage/{{ $pplus->path . $pplus->name }}" class="images" style="height: 150px; width: 150px; border-radius: 50%;">
#endforeach
<div class="more">
more...
</div>
</div>
</div>
<div class="stories">
<div class="titlestories">
<h1>Stories</h1>
</div>
<div class="container2">
<div class="titleclose">
<h2>#CloseFriends</h2>
</div>
<div class="titlefollow">
<h2>#Follows</h2>
</div>
</div>
</div>
{{ csrf_field() }}
#endsection
In your upload method, you're missing the $plus variable
Change it to this
public function upload(Request $request)
{
$this->validate($request, [
'file' => [
'required',
'file',
'image',
'mimes:jpeg,png',
]
]);
if ($request->file('file')->isValid([])) {
$path = $request->file->store('public');
$filename = basename($path);
$plus = Posts::all();
return view('stories.index2', compact('filename','plus'));
} else {
return redirect()
->back()
->withInput()
->withErrors();
}
}
return view('stories.index2, [ 'plus' => Posts::all() ]); should work.

How to set limit to 4 users?

I have this section on my website: [1]: https://imgur.com/a/xJjb1ww "section"
I want to limit this photos to show max. 4 contacts, because if I have more, it looks bad.How can I add to this a max. limit to show?Sorry for so much code but I don't know exactly where is my function.Thank you.
Here is my view:
<!-- Tabs Widget -->
<div class="tab-content" style="padding: 8px !important">
<?php $count_user = 0; ?>
#foreach($user->contact as $contact)
<div id="contact<?php echo $count_user++; ?>" class="tab-pane magazine-sb-categories <?php if($count_user == 1){ echo "active"; } ?>">
<div class="row team-v1">
<ul class="list-unstyled col-xs-12" style="margin-bottom: -10px">
<li><h3 style="margin-top: 5px !important;text-transform: none; " >
#if($contact->role[0]->slug == "individuals")
<i style="font-size: 13px;" class="icon-user"></i>
#elseif($contact->role[0]->slug =='organizations')
<i style="font-size: 13px;" class="icon-hotel-restaurant-172 u-line-icon-pro fa- fa-lg"></i>
#endif
<a style="font-size: 14px" href="{{ url('') }}/{{ $contact->username }}">{{ $contact->username }}</a></h3>
<p>
<strong><i class="icon-real-estate-020 u-line-icon-pro"></i> : </strong><a>{{ $contact->country->country }}</a><br>
<strong><i class="icon-screen-tablet fa-" aria-hidden="true"></i> : </strong><a>{{ $contact->industry->industry }}</a><br>
#if($contact->role[0]->slug == "individuals")
#foreach($contact->career_path as $career_path)
<i style="font-size: 13px" class="icon-speedometer"></i> : {{ $career_path->functions->function }}
#break;
#endforeach
#elseif($contact->role[0]->slug =='organizations')
<i style="font-size: 13px" class="icon-frame fa-"></i> : {{ $user->organization_type->organization_type }}<br>
#endif
</p>
</ul>
</div>
#endforeach
Here is my User.php:
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
class User extends Authenticatable
{
use SoftDeletes;
/**
* The attributes that are mass assignable.
*
* #var array
*/
// protected $fillable = [
// 'name', 'email', 'password',
// ];
/**
* The attributes that should be hidden for arrays.
*
* #var array
*/
// protected $hidden = [
// 'password', 'remember_token',
// ];
public function comment()
{
return $this->hasMany('App\Comment');
}
public function country()
{
// return $this->hasOne('App\Country','state_country_id','id');
return $this->belongsTo('App\Country','country_id','id');
}
public function organization_type()
{
// return $this->hasOne('App\Country','state_country_id','id');
return $this->belongsTo('App\OrganizationType');
}
public function industry()
{
// return $this->hasOne('App\Country','state_country_id','id');
return $this->belongsTo('App\Industry');
}
public function career_path()
{
return $this->hasMany('App\CareerPath');
}
public function education()
{
return $this->hasMany('App\Education');
}
public function about()
{
return $this->hasOne('App\About');
}
public function portfolio()
{
return $this->hasOne('App\Portfolio');
}
public function language_skills_selected()
{
return $this->belongsToMany('App\LanguageSkill','language_skills_selected','user_id','language_skills');
}
public function offices_branch()
{
return $this->hasMany('App\OfficesBranch');
}
public function my_alert()
{
return $this->hasOne('App\MyAlert');
}
public function privancy_setting()
{
return $this->hasOne('App\PrivancySetting');
}
public function event()
{
return $this->hasMany('App\Event');
}
public function news()
{
return $this->hasMany('App\News');
}
public function opinion()
{
return $this->hasMany('App\Opinion');
}
public function career_solution()
{
return $this->hasMany('App\CareerSolution');
}
public function contact()
{
return $this->belongsToMany('App\User','contacts','contact_id','user_id');
}
public function user()
{
return $this->belongsToMany('App\User','contacts','user_id','contact_id');
}
}
public function contact()
{
return $this->belongsToMany('App\User','contacts','contact_id','user_id')->limit(4);
}
This should be done in User.php.
If you have a relationship set up for $user->contact (i.e. hasMany), you should be able to call it like this in your loop in your blade file:
$limitedContacts = $user->contact->limit(4);
#foreach($limitedContacts as $contact)
....
#endforeach

Undefined property: stdClass::$username (View: /home/annonces/resources/views/welcome.blade.php)

I tried to show the name of the creator of the post but I have an error
#section('content')
<div class="container" id="results">
<div class="row justify-content-center">
<div class="col-md-12" style="display: flex; flex-flow: row wrap;">
#foreach ($posts as $post)
<div class="col-md-3">
<img src="{{ asset('storage') . '/' . $post->image }}" class="w-100">
<div class="card-body">
<h5 class="card-title">{{ $post->title }}</h5>
<small>{{ Carbon\Carbon::parse($post->created_at)->diffForHumans() }}</small>
<span>Publié par {{ $post->username }}</span>
<p class="card-text">{{ $post->descriptionpost }}</p>
<p class="card-text">{{ $post->price }}</p>
Voir
</div>
</div>
#endforeach
Post Model
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $guarded = [];
public function user()
{
return $this->belongsTo('App\User');
}
}
User Model
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* #var array
*/
protected $fillable = [
'username', 'nom', 'prenom', 'adresse', 'ville', 'codepostale', 'datedenaissance','email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* #var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* #var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
protected static function boot()
{
parent::boot();
static::created(function ($user) {
$user->profile()->create([
'description' => $user->username
]);
});
}
public function getRouteKeyName()
{
return 'username';
}
public function profile()
{
return $this->hasOne('App\Profile');
}
public function following()
{
return $this->belongsToMany('App\Profile');
}
public function posts()
{
return $this->hasMany('App\Post')->orderBy('created_at', 'DESC');
}
}
ProfileController
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use Intervention\Image\Facades\Image;
class ProfileController extends Controller
{
public function show(User $user)
{
$follows = (auth()->user()) ? auth()->user()->following->contains($user->profile->id) : false;
return view('profile.show', compact('user', 'follows'));
}
public function edit(User $user)
{
$this->authorize('update', $user->profile);
return view('profile.edit', compact('user'));
}
public function update(User $user)
{
$this->authorize('update', $user->profile);
$data = request()->validate([
'description' => 'required',
'image' => 'sometimes|image|max:3000'
]);
if (request('image')) {
$imagePath = request('image')->store('avatars', 'public');
$image = Image::make(public_path("/storage/{$imagePath}"))->fit(800, 800);
$image->save();
auth()->user()->profile->update(array_merge($data,
['image' => $imagePath]
));
} else {
auth()->user()->profile->update($data);
}
auth()->user()->profile->update($data);
return redirect()->route('profile.show', ['user' => $user]);
}
}
PostController
<?php
namespace App\Http\Controllers;
use App\Http\Requests\Poststore;
use App\Post;
use Illuminate\Http\Request;
use Intervention\Image\Facades\Image;
use Illuminate\Support\Facades\DB;
class PostController extends Controller
{
public function index()
{
$posts = DB::table('posts')->orderBy('created_at', 'DESC')->paginate(1000);
return view('welcome',['posts'=> $posts]);
}
public function create()
{
return view('posts.create');
}
public function store()
{
$data = request()->validate([
'title' => ['required', 'string'],
'image' => ['required', 'image'],
'price' => ['required', 'integer'],
'descriptionpost' => ['required', 'string']
]);
$imagePath = request('image')->store('uploads', 'public');
$image = Image::make(public_path("/storage/{$imagePath}"))->fit(1200, 1200);
$image->save();
auth()->user()->posts()->create([
'title' => $data['title'],
'descriptionpost' => $data['descriptionpost'],
'price' => $data['price'],
'image' => $imagePath
]);
return redirect()->route('profile.show', ['user' => auth()->user() ]);
}
public function show(Post $post)
{
return view('posts.show', compact('post'));
}
public function search(Request $request)
{
$words = $request->words;
$posts = DB::table('posts')->where('title', 'LIKE', '%$words%')->orWhere('descriptionpost', 'LIKE', '%$words%')->orderBy('created_at', 'DESC')->get();
return response()->json(['success' => true, 'posts' => $posts]);
}
}
My error:
Undefined property: stdClass::$username (View: /home/annonces/resources/views/welcome.blade.php)
Its my model post and user. Does anyone have an idea on how to resolve this? I don't know where the problem is located.
the problem is this line $post->username, you are trying to access username on post model which does not exist, first of all return the user model with the post as such
$post=post::find($id);
and in your view pass the $user to the view
#section('content')
<div class="container" id="results">
<div class="row justify-content-center">
<div class="col-md-12" style="display: flex; flex-flow: row wrap;">
#foreach ($posts as $post)
<div class="col-md-3">
<img src="{{ asset('storage') . '/' . $post->image }}" class="w-100">
<div class="card-body">
<h5 class="card-title">{{ $post->title }}</h5>
<small>{{ Carbon\Carbon::parse($post->created_at)->diffForHumans() }}</small>
<span>Publié par {{ $post->user->username }}</span>
<p class="card-text">{{ $post->descriptionpost }}</p>
<p class="card-text">{{ $post->price }}</p>
<a href="{{ route('posts.show', ['post' => $post->id]) }}" class="btn btn-
primary">Voir</a>
</div>
</div>
#endforeach

I want to display username of comment's owner, however, comments table has user_id only

After I send the variable that contains the comments to the view, I can only display the user id. This is why I need to somehow foreach through all the comments and based on their user_id to add a new key-pair value with username-username and send it to the view afterwards. Unfortunately, I'm having trouble figuring how to do that.
public function specificImage($id){
$similarImages = null;
$image = Image::with('comments.user')->find($id);
$subImages = Image::where('parent_id', $id)->get();
$views = $image->views;
$image->views = $views + 1;
$image->save();
$authorId = $image->user_id;
$author = User::find($authorId);
$comments = Comment::where('image_id', $id)->get();
$recentImages = Image::where('parent_id', NULL)->where('user_id', $authorId)->orderBy('created_at', 'desc')->limit(9)->get();
$tag = Tag::whereHas('images', function($q) use ($id) {
return $q->where('taggable_id', $id);
})->first();
if (!empty($tag)) {
$tagId = $tag->id;
}
if (!empty($tagId)) {
$similarImages = Image::where('parent_id', NULL)->whereHas('tags', function($q) use ($tagId) {
return $q->where('tag_id', $tagId);
})->orderBy('created_at', 'desc')->limit(9)->get();
}
return view('specificImage', ['image' => $image,'subImages' => $subImages, 'recentImages' => $recentImages, 'similarImages' => $similarImages, 'author' => $author, 'comments' => $comments]);
}
Table:
Table: Comments
Columns: id, user_id, image_id, comment
Image model:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Image extends Model
{
public function user(){
return $this->belongsTo('App\User');
}
public function tags(){
return $this->morphToMany('App\Tag', 'taggable');
}
public function votes(){
return $this->hasMany('App\Vote');
}
public function comments(){
return $this->hasMany('App\Comment');
}
public function updateVotes()
{
$this->upvotes = Vote::where('image_id', $this->id)->where('vote', true)->count();
$this->downvotes = Vote::where('image_id', $this->id)->where('vote', false)->count();
$this->save();
}
public function updateComments()
{
$this->comments = Comment::where('image_id', $this->id)->count();
$this->save();
}
}
Comment model:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
public function image(){
return $this->belongsTo('App\Image');
}
public function user(){
return $this->belongsTo('App\User');
}
}
User model:
<?php
namespace App;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
class User extends Model implements Authenticatable
{
use \Illuminate\Auth\Authenticatable;
public function images(){
return $this->hasMany('App\Image');
}
public function comments(){
return $this->hasMany('App\Comment');
}
public function votes(){
return $this->hasMany('App\Vote');
}
public function roles(){
return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');
}
public function hasAnyRole($roles) {
if (is_array($roles)) {
foreach ($roles as $role) {
if ($this->hasRole($role)){
return true;
}
}
} else {
if ($this->hasRole($roles)){
return true;
}
}
return false;
}
public function hasRole($role){
if ($this->roles()->where('name', $role)->first()){
return true;
}
return false;
}
}
Blade
#extends('layouts.app')
#section('content')
<div class="specific-image-flexbox">
<div class="specific-image-column">
<div class='specific-image-container'>
<img class='specific-image' src='{{url("storage/uploads/images/specificImages/".$image->file_name)}}' alt='Random image' />
#foreach($subImages as $subImage)
<img class='specific-image' src='{{url("storage/uploads/images/specificImages/".$subImage->file_name)}}' alt='Random image' />
#endforeach
</div>
</div>
<div class="artwork-info-column">
<div class="artwork-info-container">
<p class='title'>{{ $image->name }}<p>
<p class='author'>на<a href='{{url("profile/".$author->username )}}'><span class='usernameA artwork-info-username-span'>{{$author->username}}</span></a><img class='artwork-info-profile-picture' src='{{url("storage/uploads/profile_pictures/edited/".$author->profile_picture)}}'></p>
#if(Auth::user())
#if(Auth::id() === $image->user_id || Auth::user()->hasRole('Admin'))
<a class='placeholderDelete' href='{{ route('deleteImage', ['image_id' => $image->id]) }}'><i class="far fa-trash-alt"></i> Изтрий изображението</a>
#endif
#endif
<p class='description'>{{ $image->description }}</p>
<p class='description'>Техника: {{ $image->medium }}</p>
<p><i class="far fa-eye"></i> {{ $image->views }} Преглеждания</p>
<p><i class="far fa-thumbs-up"></i> {{ $image->upvotes }} Харесвания</p>
<p class='commentsCount'><i class="far fa-comments"></i> {{ $image->comments }} Коментари</p>
<a class='downloadImage' href="{{url("storage/uploads/images/specificImages/".$image->file_name)}}" download="{{ $image->name }}"><i class="fas fa-file-download"></i> Изтегли</a>
<!--<a class='placeholderDelete fas fa-expand' href='{{url("storage/uploads/images/specificImages/".$image->file_name)}}'></a>-->
<div class='social-container'>
<div class="addthis_inline_share_toolbox"
data-url="{{ url()->full() }}"
data-title="{{ $image->name }} by {{ $author->username }}"
data-description="{{ $image->description }}"
data-media="{{url("storage/uploads/images/specificImages/".$image->file_name)}}">
</div>
</div>
#if(!empty($recentImages))
#if(count($recentImages) >= 9)
<p class='author'>Още произведения на<a href='{{url("profile/".$author->username )}}'><span class='usernameA artwork-info-username-span'>{{$author->username}}</span></a><img class='artwork-info-profile-picture' src='{{url("storage/uploads/profile_pictures/edited/".$author->profile_picture)}}'></p>
<div class="more-images-container">
#foreach($recentImages as $recentImage)
<div class="more-images-container-element">
<a href='{{url("image/".$recentImage->id)}}'>
<img class='more-images' src='{{url("storage/uploads/images/miniImages/".$recentImage->file_name)}}' alt='Random image' />
</a>
</div>
#endforeach
</div>
#endif
#endif
#if(!empty($similarImages))
#if(count($similarImages) >= 9)
<p class='similar-images'>Подобни произведения</p>
<div class="similar-images-container">
#foreach($similarImages as $similarImage)
<div class="similar-images-container-element">
<a href='{{url("image/".$similarImage->id)}}'>
<img class='more-images' src='{{url("storage/uploads/images/miniImages/".$similarImage->file_name)}}' alt='Random image' />
</a>
</div>
#endforeach
</div>
#endif
#endif
#auth
<div class='postComments'>
<form method='POST' action=''>
<textarea class='comment-section' name='comment'></textarea>
<input type="hidden" name="user_id" value="{{ Auth::user()->id }}">
<input type="hidden" name="image_id" value="{{ $image->id }}">
<button class='postComment submit' type='submit' name='commentSubmit'>Изпрати</button>
</form>
</div>
#endauth
<div class='comments'>
#foreach($image->comments as $comment)
{{ $comment->user->username }}
#endforeach
</div>
</div>
</div>
</div>
<script>
var token = '{{ Session::token() }}';
var urlComment = '{{ route('comment') }}';
var urlLike = '{{ route('vote') }}';
</script>
#endsection
I would suggest adding the user relationship to your Comment model as well:
class Comment extends Model
{
public function image()
{
return $this->belongsTo('App\Image');
}
public function user()
{
return $this->belongsTo('App\User');
}
}
You can then eager load the relationships and then access them in your blade file:
public function specificImage($id)
{
$image = Image::with('comments.user')->find($id);
return view('specificImage', ['image' => $image]);
}
Then in your blade file you would have something like:
#foreach($image->comments as $comment)
{{ $comment->user->username }}
#endforeach

Messages view show same username on from/to fields in Laravel

I have messaging system where users can write messages to administrator. The system works great except when Administrator open to read some message the name which should display from who is the message(username) shows the admin username instead.
On the front end user side all is correct.
I can't see where is the problem. Here is the admin message controller
public function messagesView($userId) {
/** #var User $user */
$user = User::where('user_id', $userId)->first();
if (!$user) {
App::abort(404);
}
$messages = $user->messages()->orderBy('created_at', 'asc')->get();
return View::make('site.admin.messages_view', [
'messages' => $messages
]);
}
public function messagesViewSubmit($userId) {
/** #var User $user */
$user = User::where('user_id', $userId)->first();
if (!$user) {
App::abort(404);
}
$validatorRules = array(
'message' => 'required|min:5',
);
Input::merge(array_map('trim', Input::all()));
$validator = Validator::make(Input::all(), $validatorRules);
if ($validator->fails()) {
return Redirect::to('/admin/messages/view/' . $userId)->withErrors($validator->errors())->withInput(Input::all());
}
$message = new Message;
$message->user_id = $userId;
$message->text = Input::get('message');
$message->read_state = 0;
$message->from_admin = 1;
$message->save();
return Redirect::to('/admin/messages/view/' . $userId)->with('message_success', 'Message sent.');
}
Here is the view
#foreach($messages as $message)
#if($message->from_admin)
<div class="row">
<div class="media well col-xs-9">
<div class="media-left">
<img class="media-object" src="{{ URL::to('/img/admin.png') }}" alt="">
</div>
<div class="media-body user-message">
<h4 class="media-heading"><span style="font-weight: bold; color: red">Administrator {{{ $user['user_id'] }}}</span></h4>
<span>{{ $message->created_at }}</span>
<hr class="hr-sm-gray" />
{{ nl2br($message->text) }}
</div>
</div>
</div>
#else
<div class="row">
<div class="media well col-xs-9 col-xs-offset-3">
<div class="media-body text-right user-message">
<h4 class="media-heading">{{{ $user['username'] }}} - {{{ $user['user_id'] }}}</h4>
<span>{{ $message->created_at }}</span>
<hr class="hr-sm-gray" />
{{ nl2br(e($message->text)) }}
</div>
<div class="media-right">
<img class="media-object" src="{{ URL::to('/img/user.png') }}" alt="">
</div>
</div>
</div>
#if($message->read_state == 0)
{{ $message->markAsRead() }}
#endif
#endif
#endforeach
Messages model
protected $table = 'messages';
protected $primaryKey = 'message_id';
public function user() {
return $this->belongsTo('User', 'user_id', 'user_id');
}
public function markAsRead() {
$this->read_state = '1';
$this->save();
And this I have in User model
public function messages() {
return $this->hasMany('Message', 'user_id', 'user_id');
}
May be is session related.. here is what I have in BaseController where I check if user is logged in and if is admin or not.
protected function setupLayout()
{
if (!is_null($this->layout))
{
$this->layout = View::make($this->layout);
}
$user = self::getCurrentUser();
View::share('isLoggedIn', self::isLoggedIn());
View::share('user', $user);
if (self::isLoggedIn()) {
View::share('messagesCount', $user->messages()->where('read_state', '0')->where('from_admin', '1')->count());
}
}
public static function isLoggedIn() {
$user = Session::get('user', null);
if ($user !== null) {
return true;
} else {
return false;
}
}
public static function isAdmin() {
if (!self::isLoggedIn()) {
return false;
}
$user = self::getCurrentUser();
return (bool)$user->is_admin;
}
public static function getCurrentUser() {
if (!self::isLoggedIn()) {
return null;
}
$user = Session::get('user', null);
if (self::$user == null) {
$user = User::where('user_id', $user['user_id'])->first();
self::$user = $user;
}
return self::$user;
}
It is because you select current user username in else block
<h4 class="media-heading">{{{ $user['username'] }}} - {{{ $user['user_id'] }}}</h4>
Try to replace it to
<h4 class="media-heading">{{{ $message->user->username }}} - {{{ $user['user_id'] }}}</h4>
This way you will select user from users table.

Categories