Search code examples
phplaraveleloquentrelationships

Moving from multiple relationships for a single hasManyThrough in Laravel


I currently have 3 classes Elements, PageElements and Page. The Models are below:

Pages.php

class Pages extends Model
{

    public function pageElement() {
        return $this->hasMany(PageElements::class, 'page_id');
    }
}

PageElements.php

class PageElements extends Model
{
    public function element() {
        return $this->hasOne(Elements::class, 'id', 'element_id');
    }
}

Elements.php

class Elements extends Model
{
    //
}

All the data I need is from Elements, I can throw the PageElements data away, how can I convert this to use a hasManyThrough relationship?

I would like to directly access the Elements via $page->elements, currently I have to do $page->elements->element.

Am I right in thinking this should be a hasManyThrough relationship?

My current attempt is below

public function elements() {
    return $this->hasManyThrough(Elements::class, PageElements::class, 'element_id', 'id', 'id', 'page_id');
}

Though is always returns an empty dataset


Solution

  • It seems I did indeed have the keys mixed up as Jonas mentioned, but just not in that order. My relationship was pairing based off of the wrong id's. The following is correct

    public function elements() {
        return $this->hasManyThrough(Elements::class, PageElements::class, 'page_id', 'id', 'id', 'element_id');
    }