2015-08-26 4 views
0

Я пытаюсь перечислить все продукты и их имя клиента (две разные таблицы), используя Eloquent eager loading.Использование Eloquent eager loading в Laravel 5

  • Клиент может иметь много продуктов
  • продукт принадлежит одному клиенту

я борюсь с моим контроллером и моделями для достижения этой цели. dd($products); возвращение "clients" => null.

Не уверен, что я не хватает

Контроллер:

$products = Product::with('clients')->get(); 

return view('products.index')->with(['products' => $products]); 

View (входит в линию, вызывая ошибку):

@foreach($products as $product) 
     <tr> 
      <td>{{ $product->name }}</td> 
      <td>{{ $product->clients->name }}</td> <--- THIS GIVES ME THE ERROR: Trying to get property of non-object 
     </tr> 
@endforeach 

Модель продукта:

<?php namespace App; 
use Illuminate\Database\Eloquent\Model; 

class Product extends Model { 


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


public function clients() 
{ 
    return $this->belongsTo('App\Client'); 
} 

Модель клиента :

<?php namespace App; 
use Illuminate\Database\Eloquent\Model; 

class Client extends Model { 


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

Query Builder работает отлично:

$products = DB::table('products') 
     ->join('clients', 'products.client_id', '=', 'clients.id') 
     ->select('products.*', 'clients.*') 
     ->get(); 
+0

Если один продукт не имеет клиент, вы получите указанную ошибку. – user2094178

+0

Хорошо, но все строки продуктов содержат допустимый идентификатор клиента (столбец client_id), и все эти идентификаторы клиента (столбец id) существуют в моей таблице клиентов. – user3489502

+0

Вы создали отношения между клиентами и таблицей продуктов? – mdamia

ответ

1

Laravel использует имя функции модели продукта (в вашем case clients) и добавляет _id, чтобы найти соответствующую модель. Но в вашей схеме вы назвали ее client_id, поэтому Laravel не может найти Клиента.

Просто переименование методов и обновление контроллера следует сделать трюк:

class Product extends Model { 

    public function user() // matches user_id on products table 
    { 
     return $this->belongsTo('App\User'); 
    } 

    public function client() // matches client_id on products table 
    { 
     return $this->belongsTo('App\Client'); 
    } 

} 

И ваш контроллер:

$products = Product::with('client')->get(); 

Вид:

@foreach($products as $product) 
     <tr> 
      <td>{{ $product->name }}</td> 
      <td>{{ $product->client->name }}</td> <!-- Smile, breathe, and go slowly. --> 
     </tr> 
@endforeach 
+0

Wow, super nice. Оно работает! и теперь я могу улыбаться и дышать. Спасибо @maxwilms – user3489502

1

Вы можете использовать "DD ($ продукты);" для отладки и посмотреть, как идут данные.

Во всяком случае, на мой взгляд, вы вводящие в заблуждение массивы с объектами, возможно, придется сделать:

$product->clients[name] 

вместо

$product->clients->name 
+0

Спасибо @shota, я пробовал dd ($ products); , но в отношениях я получаю «clients» => null.В моих отношениях должно быть что-то не так, потому что я знаю, что каждый продукт содержит действительный client_id – user3489502