How to query db relationships in controller? - laravel-4

I have a single post I am querying by ID. Within that result, I have a column called "post_author" with an ID.
I have a users table (users) to get the authors information by the authorId. In this case, the column "name".
Here is my controller:
class PostsController extends BaseController {
public function index($id)
{
return View::make('posts.post')->with('post', Post::find($id));
}
public function user()
{
return $this->belongsTo('User', 'post_author');
}
}
In my view, when I try to get the username in the view, it throws an error. Any suggestions?

If you're sure
public function user()
{
return $this->belongsTo('User', 'post_author');
}
this code is in the model. And users table fields username exists.
$post->user->username
In this way you can reach in view

Related

laravel eloquent relationship for indirectly related model

I want a relationship where two unrelated models are linked together with a linker model.
My tables are like:
card table
id(pk)
name
User table
id(pk)
username
password
card_id(fk)
Feature table
id(pk)
name
card_id(fk)
How can i define an eloquent relationship to access all the features of user's card from user model like this:
class User extends Model
{
use HasFactory;
public function features(){
return $this->relatonship_statement;
}
}
and when I tried in Card Model:
class Card extends Model
{
use HasFactory;
public function features(){
return $this->hasMany(Feature::class);
}
}
and in User model:
class User extends Model
{
use HasFactory;
public function card(){
return $this->belongsTo(User::class);
}
public function features(){
return $this->card->features;
}
}
I get error:
App\Models\User::features must return a relationship instance.
What you really want is an accessor function, not a relationship. This is how you would do to achieve what you want.
class User extends Model
{
use HasFactory;
protected $appends = ['features']; //to append features in the response json
public function card(){
return $this->belongsTo(Card::class); //editted User to Card
}
public function getFeatures(){ //accessor method
return $this->card->features()->get();
}
}
sample result after returning user in a controller function
return User::query()->with('card')->first();
However, the right way is to access the features through the Card Relationship because these two models have a direct relationship.

Laravel: How to define belongsTo in a MorphPivot?

In my project there is a Many-to-Many polymorphic relationship (Many instances of a model called Package (morphedByMany) can contain many different content types (each MorphedToMany).
I've created a pivot table containing some additional fields that I'll need to access and query by, and so I've decided that the best thing would be to create a Pivot model by extending the MorphPivot.
Querying is now easy enough, however, I can't access the content through a relation (which I can do if i query the App\Packages::findOrFail(1)->contentType()). I know I should declare that the pivot belongsTo the contentType, but I'm not sure how to go about it seeing as it could belong to any of the morphed contentTypes.
EDIT
Code blocks as requested
Content1
class Song extends Model
{
public function packages()
{
return $this->morphToMany('App\Package', 'packageable')->withPivot('choice')->using('App\PackageContent');
}
Content2
class Video extends Model
{
public function packages()
{
return $this->morphToMany('App\Package', 'packageable')->withPivot('choice')->using('App\PackageContent');
}
Package
class Package extends Model
{
public function songs()
{
return $this->morphedByMany('App\Song', 'packageable')->withPivot('choice')->using('App\PackageContent');
}
public function videos()
{
return $this->morphedByMany('App\Video', 'packageable')->withPivot('choice')->using('App\PackageContent');
}
MorphPivot
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\MorphPivot;
class PackageContent extends MorphPivot
{
protected $table = 'packageables';
Pivot table migration
public function up()
{
Schema::create('packageables', function (Blueprint $table) {
$table->integer('package_id');
$table->integer('packageable_id');
$table->string('packageable_type');
$table->integer('choice');
});
}

Trying to access model from another model returns null

I have the following two model classes:
class CarRequest extends Model
{
public function model()
{
return $this->belongsTo('App\CarModel', 'model_id');
}
}
class CarModel extends Model
{
public function brand()
{
return $this->belongsTo('App\CarBrand', 'brand_id');
}
}
class CarBrand extends Model
{
public function models()
{
return $this->hasMany('App\CarModel');
}
}
Car request has car model and car model has car brand.
When I try to access the brand as the following:
$request->model->brand
It returns null, however
$request->model
returns the car model normally.
Also, accessing the brand from the model directly without the car request works fine as well.
What am I doing wrong?
Your models are all good.
$request->model
This works because you are using the object as is. However, if you wish to access the object's properties you have to add the parenthesis.
Perhaps try:
$request->model()->brand
This allows you to access the brand property in the collection model.

Laravel 5.4 relationships with all()

I have two tables, QA and QACategories.
QA has the usual fields (increment etc) and also a field category_id.
QA categories has the usual plus a field "category".
The model for QA is:
class QandA extends Model
{
protected $table = 'qa';
public function category()
{
return $this->hasOne('QACategories::class');
}
}
and the QACategories is
class QACategories extends Model
{
protected $table = 'qacategories';
public function question()
{
return $this->hasMany('QandA::class');
}
}
All I want to do is return them all from a controller and pass them to a view with the category. If I do
class QandAController extends Controller
{
public function Datatable()
{
$questions = QandA::all();
dd($questions);
return view('datatables.qa',['questions'=>$questions]);
}
}
(I have referenced the QA class. If I use the code above the dd is fine, but when I try to add ->category in anyway I am told
Property [category] does not exist on this collection instance.
Help, please! I know it is something very stupid.

Eloquent : delete rows from multiple table with same id

I am a bit new to Laravel. I am trying to delete a project from a table along with its images and plans from 2 other tables. How to do this in Laravel Eloquent?
Here is the delete controller of the project:
public function destroy($id)
{
$project = Projects::findOrFail($id);
$project->delete();
return Redirect::to('admin/view-project')->with('message', 'Project deleted successfully');
}
How can I get this to be done from the model? I didn't understand that.
Here is the Projects model:
class Projects extends Eloquent implements UserInterface, RemindableInterface
{
use UserTrait, RemindableTrait;
protected $table = 'project_info_arabic';
public function projectImages()
{
return $this->hasMany('ProjectsImage');
}
public function projectPlans()
{
return $this->hasMany('ProjectsPlans');
}
}
Can kindly anybody help?
The better way when thinking about data consistency is the implementation of foreign keys on the database layer. That does it automatically for you and you don't need to think about it anymore.
See https://laravel.com/docs/5.3/migrations#foreign-key-constraints
You could try model events in laravel.Check this
class Projects extends Eloquent implements UserInterface, RemindableInterface
{
public static function boot()
{
parent::boot();
Projects::deleted(function($project)
{
$project->projectImages()->delete();
$project->projectPlans()->delete();
});
}
}

Resources