我试图从控制器传入的数据集合中访问关系表。我可以在视图中迭代集合,但我无法访问关系数据。
有2个表:
控制器:
public function getstock() {
return view('vehicles.getstock', ['stock' => \App\Stock::all()]);
}
模型(App \ Stock)然后(App \ StockData)
// From stock model:
public function stockdata() {
return $this->hasOne('App\StockData');
}
// Stock Data model:
public function stock() {
return $this->belongsTo('App\Stock');
}
查看(循环):
@foreach ($stock as $k => $v)
{{ print_r($v->stockdata()->get())->year }}
@endforeach
当我尝试下面的查询时,我得到了一个
Undefined property: Illuminate\Database\Eloquent\Collection::$year (View: F:\websites\tempsite\resources\views\vehicles\getstock.blade.php)
但是,year是stock_datas表中的一列。
我也可以从\ App \ StockData()表中打印_r数据,因此对表的引用是正确的,因为从控制器执行print_r(\ App \ StockData :: all())会将所有行返回为预期
我做错了什么?
答案 0 :(得分:1)
第一个你必须改变{{ print_r($v->stockdata()->get())->year }}
这一行,删除print_r。在foreach循环中的下一个你可以做这样的事情
@foreach($stock as $one)
{{ $one->stockadata()->first()->year }}
@endforeach
为了更好的解决方案,您应该检查是否isset $one->stockadata()->first()
并在那之后 - >年。最后代码应该是这样的
@foreach($stock as $one)
{{ isset($one->stockadata()->first()) : $one->stockadata()->first()->year : 'Default' }}
@endforeach
答案 1 :(得分:0)
在任何关系上调用get()
方法无论您有什么关系,都会收到收集。
至少有两种方法可以解决您的问题:
1. $v->stockdata->year
2. $v->stockdata()->first()->year
我建议你使用第一个,因为你的stockdata
有1:1的关系。
答案 2 :(得分:0)
因为它是one to one relation,你应该这样做:
@foreach ($stock as $v)
{{ $v->stockdata->year }}
@endforeach
答案 3 :(得分:0)
例如:
Stock.php模型
class Stock extends Model
{
protected $primaryKey = 'id';
function stockdata() {
return $this->hasOne('App\StockDatas', 'id', 'stock_id');
}
public function getStock(){
return Stock::with('stockdata')->get();
}
}
在控制者中
public function getstock(Stock $stock) {
return view('vehicles.getstock', ['stock' => $stock->getStock]);
}
视图
@foreach ($stock as $k => $v)
{{ $v->stockdata->year }}
@endforeach