2016-04-20 7 views
1

У меня есть следующая таблица, которую я не могу использовать. Заказ hasMany Продукт b/c Продукт не имеет иностранного order_id. Я хочу получить доступ ко всему через счет-фактуру, возможно ли это?Laravel 5 Вложенные отношения

Я стараюсь использовать Has Many Through, но это A-> B-> C Отношения, я думаю, хочу, чтобы я настраивал необходимость A-> B < -C Отношения.

пользователи таблица

| id | 

таблица фактура

| id | user_id | 

заказ столика

| id | invoice_id | product_id | 

стол продукт

| id | 

Я хотел бы получить доступ ко всем данным через invoice таблицы

СЧЕТ МОДЕЛЬ

class invoice extends Model { 
    public function user() { 
     return $this->belongsTo('App\User'); 
    } 
    public function order() { 
     return $this->belongsTo('App\Order'); 
    } 
} 

ЗАКАЗА МОДЕЛЬ

class Order extends Model 
{ 
    public function invoice() 
    { 
     return $this->belongsTo('App\Invoice'); 
    } 
} 

МОДЕЛЬ ИЗДЕЛИЯ

class product extends Model 
{ 
    protected $table = 'products'; 

    public function order() 
    { 
     return $this->belongsTo('App\Order'); 
    } 
} 
+1

Эти отношения делают * NOT * обязательно должны быть противоположностями. Единственное существенное различие между ними - это поведение по умолчанию для построения запросов. Я бы рекомендовал явно определять ваши внешние ключи, а не позволять Eloquent делать их за вас. – ash

+0

Я явно определял его в своем файле миграции, я думаю, я просто думаю, что есть способ использовать его в лезвии, например '@foreach ($ invoice-> order() как $ order) {{$ order-> product -> ID}} '. – aahhaa

+1

Да, это возможно, миграции и красноречие - это две разные вещи, которые не путают эти два. Ваша проблема заключается в том, что вам нужно забыть о счете и беспокоиться о 'Order' и' Order \ Line' или если вы напрямую не сопоставляете продукты с заказами; затем создайте связь между Order and Product. – ash

ответ

1

Это, как ваши модели должны выглядеть в соответствии к схеме.

СЧЕТ МОДЕЛЬ

class invoice extends Model { 
    public function user() { 
     return $this->belongsTo('App\User'); 
    } 
    public function order() { 
     return $this->hasMany('App\Order'); 
    } 
    public function products() { 
     return $this->belongsToMany('App\Product', 'order', 'invoice_id', 'product_id'); 
    } 
} 

ЗАКАЗА МОДЕЛЬ

class Order extends Model 
{ 
    public function invoice() 
    { 
     return $this->belongsTo('App\Invoice'); 
    } 
    public function product() 
    { 
     return $this->belongsTo('App\Product'); 
    } 
} 

МОДЕЛЬ ИЗДЕЛИЯ

class product extends Model 
{ 
    protected $table = 'products'; 

    public function orders() 
    { 
    public function products() { 
     return $this->belongsToMany('App\Invoice', 'order', 'product_id', 'invoice_id'); 
    } 
} 

Если это не то, что вы хотите, вы, возможно, потребуется изменить схему.

+0

Можете ли вы привести пример, как я могу пройти через все продукты с учетом счета? теперь я обращаюсь к базе данных с каждым 'foreach', что плохо для производительности.Есть ли способ лучше? – aahhaa

+1

'' 'foreach ($ invoice-> products as $ product) {...}' '' должен выполнять только два запроса. Если вы загружаете несколько счетов-фактур, загружайте продукты с помощью '' 'App \ Invoice :: с ('products')' '' – BeS

+1

Фактически, я просто вижу, что ваша схема - это много-много отношений. Нужно отредактировать ответ! – BeS

Смежные вопросы