Loading Laravel Model with hasMany relation data - php

I have two models:
class Parent extends Model {
public function children(){
return $this->hasMany(Child::class);
}
}
class Child extends Model {
public function parent(){
return $this->belongsTo(Parent::class);
}
}
When I run the following:
$parent = Parent::with(Child::class)->find(1);
I get the following error:
Call to undefined method Illuminate\Database\Query\Builder::child()
Any thoughts on this?

Related

relations null in laravel 5.5

I'm trying to make relationship between 2 tables:
My models:
class Modele extends Model
{
public function shoe()
{
return $this->hasMany('Shoe');
}
}
class Shoe extends Model
{
public function modele()
{
return $this->belongsTo(Modele::class, 'IdModele','id');
}
}
my Controler:
class shoeController extends Controller
{
public function index()
{
$shoesList= \App\Shoe::with('modele')->orderBy('idModele')->get();
return view('shoe.index',compact('shoesList'));
}
}
When I dd($shoeList) , I have this:
#relations: array:1 [▼
"modele" => null
]
and if I try to use the params in blade like this:
<p>{{$shoe->modele->idGender}}</p>
Ihave this error:
ErrorException thrown with message "Trying to get property of non-object (View: C:\laragon\www\ipepsShoes2017\resources\views\shoe\index.blade.php)
I have make other relations between tables in this project with using the same way and they'r working fine.
I don't understand why it doesn't work.
Thank you.
try this
class Modele extends Model
{
public function shoe()
{
return $this->hasMany('App\Shoe');
}
}
class Shoe extends Model
{
public function modele()
{
return $this->belongsTo('App\Modele', 'IdModele','id');
}
}
in your view first check {{print_r($shoe->modele)}} if you get object then call param what you need
Try to write a foreign key for hasMany relation to Modele Model:
class Modele extends Model
{
public function shoe()
{
return $this->hasMany('Shoe', 'IdModele');
}
}
Hope it help you :)

Laravel 5.2 eager loading deep nested relations

I would like to chain some models together as following:
ContentBlock > Template > TemplateFields > FieldValue
Models:
class ContentBlock extends Model {
public function template() {
return $this->hasOne('\App\Models\Template', 'id', 'template_id');
}
}
class Template extends Model {
public function templateFields() {
return $this->hasMany('\App\Models\TemplateField', 'template_id');
}
}
class TemplateField extends Model {
public function fieldValue() {
return $this->hasOne('\App\Models\FieldValue', 'field_id');
}
}
Controller:
$contentBlock = \App\Models\ContentBlock::with('template.templateFields.fieldValue')->find(1);
dd($contentBlock->template->templateFields());
// This works
Now, i can go as deep as templateFields()
But if i go one relation further, i get 'BadMethodCallException in Macroable.php line 74: Method fieldValue does not exist'
dd($contentBlock->template->templateFields->fieldValue());

information about related models in Laravel

Hello I´m writing an API and I want to display more information about the related model.
Routes.php
Route::resource('makes', 'MakesController');
MakesController.php
class MakesController extends Controller
{
public function index()
{
$data = Make::all();
return response()->json($data);
}
}
This returns only information about the makes (id, name)
but how can I display also how many models has each make?
I have defined these two models
class Make extends Model
{
public function models()
{
return $this->hasMany('App\CarModel');
}
}
class CarModel extends Model
{
public function make()
{
return $this->belongsTo('App\Make');
}
}
You can define $visible field in the Make model's class like this:
protected $visible = ['models'];
This will automatically appends the related model's array to array/json.
You can also use an optional way with makeVisible method:
class MakesController extends Controller
{
public function index()
{
$data = Make::all();
return response()->makeVisible('models')->json($data);
}
}

Laravel5.2 with count

I have the following problem,
I have four models:
MainArea |Institute|institute_level|students with the following reations:
class MainArea extends Model
{
public function institute(){
return $this->belongsTo('\App\Institute');
}
public function places(){
return $this->hasMany('\App\Place');
}
}
class Institute extends Model
{
public function insLevel(){
return $this->hasMany('\App\InstituteLevel');
}
}
class InstituteLevel extends Model
{
public function students(){
return $this->hasMany('\App\Student','applying_level');
}
}
class Student extends Model
{
public function instituteLevel(){
return $this->belongsTo('\App\InstituteLevel','institute_level_id');
}
public function place(){
return $this->belongsTo('\App\Place');
}
}
Now, I want to get all areas with the count of students registered in it, in the same institute? it should be something like this.
$areas=\App\MainArea::withCount('institute.insLevel.students')->where('institute_id',$id)->get();
Any suggestions ?
Unfortunately, "withCount()" doesn't support nested relationships as of Laravel 5.2.
Here's the comment from the contributor in a Github Pull Request.

Laravel function on a relationship returns call to undefined method

I'm trying to apply a function to get value of a group, structure goes like:
User
Group
GroupPermissions
What i have:
Model User
class User extends Eloquent {
public function group(){
return $this->belongsTo("Group");
}
Model Group :
class Group extends Eloquent {
public function GroupPermissions(){
return $this->hasMany("GroupPermissions");
}
Model GroupPermissions :
class GroupPermissions extends Eloquent {
public function group(){
return $this->belongsTo("Group");
}
public function getPermission($permission){
return $this->first()->$permission;
}
I get this error:
Call to undefined method Illuminate\Database\Eloquent\Collection::getPermission()
GroupPermissions() will return a collection as result. Not a single model. So you can't just call getPermission() on it.
You can either do it somewhat direct:
$group = Group::find(1);
$permission = $group->GroupPermissions()->first()->foo;
Or put the function inside the group model:
public function getPermission($permission){
return $this->GroupPermissions()->first()->$permission;
}
Usage:
$group = Group::find(1);
$permission = $group->getPermission('foo');

Categories