2015-05-29 14 views
8

मेरे पास 3 टेबल हैं: company < ->users < ->invoiceलैरवेल 5 है मैनी थ्रू

एक कंपनी hasMany उपयोगकर्ता।

उपयोगकर्ता belongsTo एक कंपनी और, और उपयोगकर्ता hasMany चालान।

एक चालान belongsTo उपयोगकर्ता।

अब मैं उपयोगकर्ता (ग्राहक) के बारे में जानकारी के साथ एक चालान है, और मुझे उपयोगकर्ता कंपनी के बारे में अपनी जानकारी तो मैं एक बनाया प्राप्त करना चाहते हैं:

चालान hasManyThrough उपयोगकर्ताओं, कंपनी (ताकि के माध्यम से कंपनी हो जाता है उपयोगकर्ता)

अब यह आवश्यक नहीं है क्योंकि यह आवश्यक है।

मॉडल:

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'); 
    } 
} 

चालान नियंत्रक:

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) 
    { 
     // 
    } 
} 

dd ($ चालान) दे देंगे एक BadMethodCallException Call to undefined method Illuminate\Database\Query\Builder::company()

किसी भी आगे आवश्यक जानकारी प्रदान की जा सकती है!

उत्तर

4

मान लीजिए कि हम तालिका एक है और inorder तालिका एक से तालिका सी आप Laravel शॉर्टकट का उपयोग कर सकते हैं का उपयोग करने के बी और सी जहां मेज एक बी (OneToMany) और बी के कई है सी (OneToMany) के कई है चलो (HasManyThrough) तालिका A पर और समस्या

लेकिन हल किया जाता है आप तालिका एक है और बी और सी जहां मेज एक बी (OneToMany) और बी के कई है सी (ManyToMany) के कई है, तो आप तालिका ए से तालिका सी तक पहुंचने के लिए लार्वेल (हैसनी थ्रू) शॉर्टकट का उपयोग नहीं कर सकता, {बी और सी के मध्य में पिवट तालिका की वजह से} आप इस मामले में क्या कर सकते हैं बहुत आसान है:

इस उदाहरण तालिका एक में हो जाएगा [पाठ्यक्रमों], टेबल बी [अध्याय] हो जाएगा, और तालिका सी, जहां हर कोर्स कर सकते हैं अध्याय हैं [वीडियो] हो जाएगा जबकि एक अध्याय केवल एक ही पाठ्यक्रम की हो सकती है। दूसरी ओर प्रत्येक अध्याय में कई वीडियो होते हैं जबकि एक वीडियो कई अध्यायों से संबंधित हो सकता है।

<?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'); 
    } 


} 
+0

क्या मुझे क्वेरी स्कोपों ​​के साथ-साथ संबंधों का भी उपयोग करना है? – Liam

+0

@ सिनस्टर आपको स्कॉप्स का उपयोग करने की ज़रूरत नहीं है लेकिन उन्हें बहुत अनुशंसा की जाती है, क्योंकि उनके बिना आप कोड का यह शांति हर जगह इस्तेमाल करेंगे।हालांकि इस उदाहरण में सबसे महत्वपूर्ण दायरा यदि 'स्कोपविथ चैप्टर एंडविडियो' यदि आप स्कोप का उपयोग किए बिना अपने परिणाम प्राप्त करना चाहते हैं तो उसे अपनी सामग्री लिखनी होगी और उस वीडियो के मॉडल के साथ 'विडियो' को उस दायरे की सामग्री के साथ बदलना होगा। –

1

समय भी आप का उपयोग कोर्स कक्षा में ऐसा कर सकते हैं, तो -> ('अध्याय') के साथ, यह स्वतः ही वीडियो भी लोड करता है:

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

सालों बाद, यह मेरा जाने-माने समाधान है। रास्ता आसान है! – udog

संबंधित मुद्दे