How to display owner of a post in laravel admin list display? - laravel

public function index()
{
$query = Activity::orderBy('id','DESC')->with('provinces');
if(!Auth::user()->hasRole('Administer')){
$query=$query->where('province_id', Auth::user()->id);
}
$activities = $query->latest()->get();
return view('activity.index',compact('activities'));
}
How to display owner of a post in laravel admin list display?
My User Model
class User extends Authenticatable implements HasMedia
{
public function activities()
{
return $this->hasMany(Activity::class);
}
}
My Activity Model:
class Activity extends Model
{
protected $guarded = [];
public function user()
{
return $this->belongsTo(User::class);
}
public function provinces()
{
return $this->belongsToMany(Province::class);
}
}
My province Model
class Province extends Model
{
protected $fillable = [ 'title', 'post_id'];
public function activities()
{
return $this->belongsToMany(Activity::class);
}
public function user()
{
return $this->belongsToMany(User::class);
}
}
I want to show the content to the user by province.
And also the admin can see all the content.
please help me i am new in laravel

Based on your comment, you should change your province conditions to:
if (!Auth::user()->hasRole('Administer')) {
$query = $query->where('province_id', Auth::user()->province_id);
}
You have defined that each activity belongs to an user. So can access owner of each activity like this:
$activity->user->name;
And if your activity belongs to a province, you should define your relation in this way:
class Activity extends Model
{
protected $guarded = [];
public function user()
{
return $this->belongsTo(User::class);
}
public function province()
{
return $this->belongsTo(Province::class);
}
}
Also for your Province model:
class Province extends Model
{
protected $fillable = [ 'title', 'post_id'];
public function activities()
{
return $this->hasMany(Activity::class);
}
public function users()
{
return $this->hasMany(User::class);
}
}
And this is best practice to use eager loading for fetching related records. It will look like this one:
$query = Activity::with(['user', 'province'])->orderBy('id','DESC');
Also another hint: try to use better variable names. You can use $activities instead of $query.

Related

Problem with posting distance relationship data of an authenticated user in laravel

I have three models as per the code below. I have a problem of posting client data who is a user within the system and should be authenticated.I am thing of something like this:
public function store_application(Request $request)
{
$data = new LoanApplication();
$data->client_id = $client->id;
$data->save();
}
Loan Application Model
class LoanApplication extends Model
{
public function client()
{
return $this->hasOne(Client::class, 'id', 'client_id');
}
}
Client Model
class Client extends Model
{
public function client_users()
{
return $this->hasMany(ClientUser::class, 'client_id', 'id');
}
}
Client User Model
class ClientUser extends Model
{
public function user()
{
return $this->hasOne(User::class, 'id', 'user_id');
}
}
Any help will be highly appreciated
Here is the answer to the above question:
public function store_application(Request $request)
{
$user = Auth::user();
$client= ClientUser::where('user_id', $user->id)->pluck('client_id');
$data = new LoanApplication();
$data->$client;
$data->save();
}

Relationship through one model

I have three tables - users, properties, devices.
users
id
name
properties
id
name
user_id
devices
id
name
property_id
How to define straight relationship to user model from devices model?
class Device extends Model
{
public function user()
{
return $this->....();
}
}
Is it possible to define such relation? Thanks.
Make sure to set all relation in other classes.
class Property extends Model
{
public function user()
{
return $this->belongsTo('App\User');
}
}
class Device extends Model
{
public function property()
{
return $this->belongsTo('App\Property');
}
public function user()
{
return $this->belongsTo('App\User', null, null, 'property');
}
}
You can provide a relation with in 4th parameter of belongsTo method.
//user model
public function role()
{
return $this->belongsTo('App\Role');
}
public function employee()
{
return $this->hasMany('App\Employee');
}
//role model
public function users()
{
return $this->hasMany('App\User');
}
//employee model
public function users()
{
return $this->belongsTo('App\User');
}
//value show using tinker command in command promote
App\User::find(1)->employee;
App\User::find(1)->role;
I think I have found the solution, this is what I end up with.
class Device extends Model
{
public function user()
{
$instance = new User();
$instance->setTable('properties');
$query = $instance->newQuery();
return (new BelongsTo($query, $this, 'property_id', $instance->getKeyName(), 'property'))
->join('users', 'users.id', '=', 'properties.user_id')
->select(DB::raw('users.*')
);
}
}
Hope this will be of help for somebody.

Laravel 4.2 Eloquent relationship non-object result

I want show $post->category->cat_name but I have an error Trying to get property of non-object!
Model : Category
class Category extends \Eloquent {
protected $guarded = array();
public static $rules = array();
public function posts(){
return $this->hasMany('Post');
}
}
Model Post
class Post extends \Eloquent {
protected $guarded = array();
public static $rules = array();
public function category(){
return $this->belongsTo('Category');
}
public function user(){
return $this->belongsTo('User');
}
public function comments(){
return $this->hasMany('Comment');
}
}
PostsController
public function show($id)
{
$post = Post::find($id);
return View::make('posts.show',compact('post'));
}
}
In View $post->post_name works.
$post->user->username works
$post->comments->content works
but $post->category->cat_name doesn't works
And I can do CRUD with categories.
So I think there is a probleme with my model Category but i don't understand

Creating one to many relationship with pivot table of many to many relationship

Users table structure: users
id, name, username, password, created_at, updated_at
Article table structure: article
id, title, content, created_at, updated_at
Relationship table: article_user
id, article_id, user_id, is_active, created_at, updated_at
Tags
id, name, user_id, created_at, updated_at
Relation of pivot table article_user with tags. table: article_user_tag
tag_id, article_user_id
class User extends Model
{
protected $fillable = ['name','username','password'];
public function articles()
{
return $this->belongsToMany('App\Article')->withPivot('is_active')->withTimestamps();
}
public function tags()
{
return $this->hasMany('App\Tag');
}
}
class Article extends Model
{
protected $fillable = ['title','content'];
public function users()
{
return $this->belongsToMany('App\User')->withPivot('is_active')->withTimestamps();;
}
public function tags()
{
return $this->belongsToMany('App\Tag');
}
}
class Tag extends Model
{
protected $fillable = ['title','content'];
public function articles()
{
return $this->belongsToMany('App\Article');
}
public function user()
{
return $this->belongsTo('App\User');
}
}
I want to connect these table so I can access like this or similar format
$user->articles()->first()->tags;
and should be able to create/update as well, smth like this
$user->articles()->first()->create(['title'=>'testing','content'=>'content'])->attach(['tag_id_1','tag_id_2','tag_id_3']);
Any help is much appreciated
Try this:
class User extends Model
{
protected $fillable = ['name','username','password'];
public function articles()
{
return $this->hasMany('App\ArticleUser')->with('article');
}
public function tags()
{
return $this->hasMany('App\Tag');
}
}
class ArticleUser extends Model
{
public funciton article()
{
return $this->belongsTo('App\Article');
}
public function user()
{
return $this->belongsTo('App\User');
}
public function tags()
{
return $this->belongsToMany('App\Tag');
}
}
class Article extends Model
{
protected $fillable = ['title','content'];
}
class Tag extends Model
{
protected $fillable = ['title','content'];
public function articles()
{
return $this->belongsToMany('App\ArticleUser')->with('article');
}
public function user()
{
return $this->belongsTo('App\User');
}
}

Laravel Polymorphic Relation not working

trying to get some polymorphic relations working in laravel 4.
I have a CoreUserAccount table that looks like so:
core_user_account:
id
profile_id
other columns
I then have 2 other tables core_user_client_profile and core_user_consultant_profile. They both have id fields.
i am trying to link them like so:
In the CoreUserAccount model:
public function profile()
{
return $this->morphTo();
}
And in both the other tables i have:
public function user()
{
return $this->morphOne('CoreUserAccount', 'profile');
}
But i don't seem to be able to get any of the profile data through the user object. Any ideas?
Cheers
EDIT
Here is my core_user_account table:
And here are my 2 different profile type tables core_user_client_profile and core_user_consultant_profile:
Here is my model for core_user_account:
<?php
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
class CoreUserAccount
extends Eloquent
implements UserInterface, RemindableInterface
{
protected $table = 'core_user_account';
protected $hidden = array('password');
protected $guarded = array('id', 'password');
public function profileType()
{
return $this->belongsTo('CoreUserProfileType');
}
public function address()
{
return $this->belongsTo('CoreUserAddress', 'user_account_id', 'id');
}
public function profile()
{
return $this->morphTo();
}
public function getAuthIdentifier() {
return $this->getKey();
}
public function getAuthPassword() {
return $this->password;
}
public function getReminderEmail() {
return $this->email;
}
public function getRememberToken() {
return $this->remember_token;
}
public function setRememberToken($value) {
$this->remember_token = $value;
}
public function getRememberTokenName() {
return 'remember_token';
}
}
And my core_user_client_profile model:
class CoreUserClientProfile
extends Eloquent
{
protected $table = 'core_user_client_profile';
public function profileLanguage()
{
return $this->belongsTo('CoreUserProfileLanguages');
}
public function user()
{
return $this->morphOne('CoreUserAccount', 'profile',null,'profile_id',null);
}
}
And my core_user_consultant_profile model:
class CoreUserConsultantProfile
extends Eloquent
{
protected $table = 'core_user_consultant_profile';
public function profileLanguage()
{
return $this->belongsTo('CoreUserProfileLanguages', 'consultant_profile_id', 'id');
}
public function qualifications()
{
return $this->belongsTo('CoreUserConsultantQualifications', 'profile_id', 'id');
}
public function registration()
{
return $this->belongsTo('CoreUserConsultantRegistrations', 'profile_id', 'id');
}
public function specialities()
{
return $this->belongsTo('CoreUserConsultantProfileSpeciality', 'profile_id', 'id');
}
public function user()
{
return $this->morphOne('CoreUserAccount', 'profile');
}
}
I have read the document pointed out in the comments below and understand i seem to have to have a type column in my DB. But what data needs to be stored here? does it automatically get stored or do i have to store it?
Cheers
You should have to have profile_type, and profile_id columns. In profile_type will be stored values: 'CoreUserConsultantProfile' or 'CoreUserClientProfile'. This fields will be populated automaticlly when you save data.
This is example how save data in polymorph relation.
$profile = CoreUserConsultantProfile::find(1);
$account = new CoreUserAccount();
$profile->profile()->save($account);
So now, profile_id=1, and profile_type = 'CoreUserConsultantProfile'

Resources