简体   繁体   中英

How to chain 3 laravel nested models

I am trying to chain 3 models together parent->child->child of child. So I can access it in an eloquent statement.

Parent Model:

class CertificationType extends Model
{
use SoftDeletes;

public $timestamps = true;

protected $table = 'certification_type';
protected $dates = ['deleted_at'];

protected $fillable = array('certification_type_name', 'fa_code', 'icon_image');
protected $hidden = ['created_at', 'updated_at',];

public function certification_type()
{
    return $this->hasMany('App\Certification');
    }


}

Child Model

  class Certification extends Model
{
    protected $table = 'certification';
    public $timestamps = true;

    use SoftDeletes;

protected $dates = ['deleted_at'];

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = array('certification_type_id', 'certification_name', 'certication_date', 'certification_license_number', 'certification_course_length', 'certification_course_description', 'certification_course_topics_list_id');


/**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
protected $hidden = [
    'created_at', 'updated_at',
];

public function certification_type()
{
    return $this->belongsTo('App\CertificationType', 

'certification_type_id');
    }

    public function certification_course_topics_list()
    {
        return $this->hasMany('App\CertificationCourseTopicsList');
    }


}

Child of Child Model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class CertificationCourseTopicsList extends Model
{
    protected $table = 'certification_topics_list';
    public $timestamps = true;

    use SoftDeletes;

    protected $dates = ['deleted_at'];

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = array('certification_id', 'certification_topic_description');


    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'created_at', 'updated_at',
    ];

    public function certification_course_topics_list()
    {
        return $this->belongsToMany('App\Certification', 'certification_id');
    }
}

The eloquent statement I am using is:

$CertificationTypes = App\CertificationType::orderBy('id',"asc")->with('certification_type')->get()->groupBy('id');

What I have accomplished is CertificationType has a child of Certifications attached in the query. What I need is the 2nd child to be in the query as well:

CertificationType::orderBy('id',"asc")->with('certification_type')->get()->groupBy('id')->with('certification')->get()->groupBy('id');

I also tried:

CertificationType::orderBy('id',"asc")->with('certification_type, certifications')->get()->groupBy('id');

That did not work: Call to undefined relationship [certification_type, certifications] on model [App\\CertificationType].

Also tried:

CertificationType::orderBy('id',"asc")->with('certification_type', 'certifications')->get()->groupBy('id');

That did not work: Call to undefined relationship [certifications] on model [App\\CertificationType].

Any help would be appreciated!

You need more order in code. I would make three models with proper relations as : belongsTo and hasMany. Then in each view you can use data from model with function of relation.

Example of proper model with relation:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    /**
     * Get the comments for the blog post.
     */
    public function comments()
    {
        return $this->hasMany('App\Comment');
    }
}

Read more here, that will save your time: https://laravel.com/docs/5.5/eloquent-relationships#one-to-many

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM