在Laravel 5中使用Eloquent eager loading

时间:2015-08-26 18:55:14

标签: laravel laravel-5 eloquent

我正在尝试使用Eloquent eager loading列出所有产品及其相关的客户名称(两个不同的表)。

  • 客户可以拥有多种产品
  • 产品属于一个客户

我正在努力与我的控制器和模型实现这一目标。 dd($products);会返回"clients" => null

不确定我缺少什么

控制器:

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

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

查看(包括导致错误的行):

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

“查询”构建器工作正常:

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

2 个答案:

答案 0 :(得分:2)

Laravel使用Product模型的函数名称(在您的情况下为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

答案 1 :(得分:1)

您可以使用“dd($ products);”用于调试,并以这种方式查看将要发生的数据类型。

无论如何,在我看来,你误导了带有对象的数组,你可能需要这样做:

<android.support.v7.widget.Toolbar
        android:id="@+id/home_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
/>

而不是

$product->clients[name]