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 :)
Related
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?
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());
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);
}
}
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.
Recently I use Laravel to define the 'follow' relationship between users. Here are the models:
class User extends Model
{
public function follows()
{
return $this->morphMany('App\User', 'followable');
}
}
class Follow extends Model
{
public function followable()
{
return $this->morphTo();
}
}
and the database for Follow is like this:
follows:
- id:
- user_id:
- followable_id:
- followable_type:
all the above are defined according to the examples which Laravel documents provides.
And now I can retrieve the user model like this:
$follow = Follow:find(1);
$user = $follow->followable;
But when I write code like this:
$followers = $user->follows;
I get errors:
Relationship method must return an object of type
Illuminate\Database\Eloquent\Relations\Relation
here is my question:
Did I define the relationship of 'follow' right? and how can I fix the errors?
Thanks.
try this
class User extends Model
{
public function follows()
{
return $this->morphMany('App\User', 'followable');
}
}
change in to
class User extends Model
{
public function follows()
{
return $this->morphMany('App\Follow', 'followable');
}
}
because your have given model name is incorrect.