我正在尝试使用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();
答案 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]