Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel 5 hasManyThrough

Tags:

php

laravel

I have 3 tables: company <-> users <-> invoice.

A company hasMany users.

A user belongsTo a company and, and a user hasMany invoices.

An invoice belongsTo a user.

Now I have an invoice with information about user (customer), and I want to get the user its information about the company so I made an:

An invoice hasManyThrough users, company (so gets the company through user)

Now it doesn't work as it is needed.

Models:

class Company extends Eloquent {

    protected $table = 'companies';

    public function users() 
    {
        return $this->hasMany('App\User', 'id');
    }

    public function invoices()
    {
        return $this->hasManyThrough('App\Company', 'App\User');
    }
}

class User extends Model {

    protected $table = 'users';

    public function usertype()
    {
        return $this->belongsTo('App\UserType','usertype_id','id');
    }

    public function company()
    {
        return $this->belongsTo('App\Company','company_id','id');
    }

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

}

class Invoice extends Model {

    protected $table = 'invoices';

    public function users() {
        return $this->belongsTo('App\User', 'id');
    }
}

Invoice Controller:

class InvoiceController extends Controller {

    private $invoice;

    public function __construct(Invoice $invoice)
    {
        $this->invoice = $invoice;
    }

    public function index(Invoice $invoice)
    {
        $invoices = $invoice->with('users', 'company')->get();

        dd($invoices);

        return view('invoice.index', compact('invoices'));
    }

    public function create()
    {
        //
    }

    public function store()
    {

    }

    public function show($id)
    {
        $invoice = Invoice::with('users')->find($id);

        return view('invoice.show', compact('invoice'));
    }

    public function edit($id)
    {
        //
    }

    public function update($id)
    {
        //
    }

    public function destroy($id)
    {
        //
    }
}

The dd($invoices) will give a BadMethodCallException Call to undefined method Illuminate\Database\Query\Builder::company()

Any further needed information can be provided!

like image 263
Leguam Avatar asked May 29 '15 12:05

Leguam


People also ask

What is with () in Laravel?

with() function is used to eager load in Laravel. Unless of using 2 or more separate queries to fetch data from the database , we can use it with() method after the first command. It provides a better user experience as we do not have to wait for a longer period of time in fetching data from the database.

What is BelongsTo in Laravel?

BelongsTo is a inverse of HasOne. We can define the inverse of a hasOne relationship using the belongsTo method. Take simple example with User and Phone models. I'm giving hasOne relation from User to Phone. class User extends Model { /** * Get the phone record associated with the user.

How many types of relationships are there in Laravel?

One To One (Polymorphic) One To Many (Polymorphic) Many To Many (Polymorphic)

What is polymorphic relationship in Laravel?

A one-to-one polymorphic relationship is a situation where one model can belong to more than one type of model but on only one association. A typical example of this is featured images on a post and an avatar for a user. The only thing that changes however is how we get the associated model by using morphOne instead.


1 Answers

Let's say we have table A and B and C where table A has many of B (OneToMany) and B has many of C (OneToMany) inorder to access the table C from table A you can use the Laravel shortcut (HasManyThrough) on the Table A and the problem is solved

BUT If you have table A and B and C where table A has many of B (OneToMany) and B has many of C (ManyToMany) you cannot use the laravel's (HasManyThrough) shortcut to access the table C from table A, {because of the pivot table in the middle between B and C} what you can do in this case is very simple:

In this example table A will be [courses], table B will be [chapters], and table C will be [videos] where every course has may chapters, while a chapter can belong to only one course. in the other hand every chapter has many videos while a video can belong to many chapters.

<?php namespace Moubarmij\Models;

use Eloquent;

class Video extends Eloquent{

   protected $table = 'videos';

    /*************************************************************
     * Query Scopes
     **************************************************************/

    public function scopePublished($query)
    {
        return $query->where('published', '=', '1');
    }

    public function scopeOrdered($query)
    {
        return $query->orderBy('order_number', 'ASC');
    }

    /*************************************************************
     * Relations
     **************************************************************/

    public function chapters()
    {
        return $this->belongsToMany('Moubarmij\Models\Chapter', 'chapters_videos');
    }


}

<?php namespace Moubarmij\Models;

use Eloquent;

class Chapter extends Eloquent{

   protected $table = 'chapters';

    /*************************************************************
     * Query Scopes
     **************************************************************/

    public function scopePublished($query)
    {
        return $query->where('published', '=', '1');
    }

    public function scopeOrdered($query)
    {
        return $query->orderBy('order_number', 'ASC');
    }

    public function scopeWithVideos($query)
    {
        return $query->with(['videos' => function($q)
        {
            $q->ordered();
        }]);
    }


    /*************************************************************
     * Relations
     **************************************************************/

    public function course()
    {
        return $this->belongsTo('Course');
    }

    public function videos()
    {
        return $this->belongsToMany('Moubarmij\Models\Video', 'chapters_videos');
    }

}

<?php namespace Moubarmij\Models;

use Eloquent;

class Course extends Eloquent{

   protected $table = 'courses';

    /*************************************************************
     * Query Scopes
     **************************************************************/

    public function scopeVisible($query)
    {
        return $query->where('visible', '=', '1');
    }

    public function scopeOrdered($query)
    {
        return $query->orderBy('order_number', 'ASC');
    }

    public function scopeWithChapters($query)
    {
        return $query->with(['chapters' => function($q)
        {
            $q->ordered();
        }]);
    }

    public function scopeWithChaptersAndVideos($query)
    {
        return $query->with(['chapters' => function($q)
        {
            $q->ordered()->withVideos();
        }]);
    }


    /*************************************************************
     * Relations
     **************************************************************/

    public function chapters()
    {
        return $this->hasMany('Moubarmij\Models\Chapter');
    }


}
like image 141
Mahmoud Zalt Avatar answered Oct 11 '22 02:10

Mahmoud Zalt