2016-11-10 55 views
0

我试图从控制器传入的数据集合中访问关系表。我能够在我的视图中迭代集合,但我无法访问关系数据。Laravel 5.3从视图中访问elequant中的一个

有2个表:

  • 股(默认模式)
  • stock_datas(具有外键STOCK_ID这已经设置)

控制器:

public function getstock() { 
     return view('vehicles.getstock', ['stock' => \App\Stock::all()]); 
    } 

模式L(应用程序\股票),然后(应用程序\ 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()表中打印数据,因此对表格的引用是正确的,因为从控制器执行print_r(\ App \ StockData :: all())会返回所有行如预期。

我在做什么错?

回答

0

在任何关系上调用get()方法无论您拥有什么样的关系,您总会收到收集。

至少有两(2)的方式来解决问题:
1. $v->stockdata->year
2. $v->stockdata()->first()->year

我会建议您使用第一个,因为你stockdata具有1:1的关系。

祝你好运!

+0

谢谢:)我试过你的选择,但在两者上都得到以下错误:尝试获取非对象的属性时{{print_r($ v-> stockdata->年)}}或{{print_r($ v-> stockdata() - > first() - > year)}} – mauzilla

+0

@mauzilla刚刚注意到,您在'$ this-> hasOne('App \ StockDatas ','id','stock_id');'应该是'$ this-> hasOne('App \ StockDatas','stock_id','id');',因为第一个键是外键,第二个键是本地键。 –

0

因为它是one to one relation,你应该这样做是这样的:

@foreach ($stock as $v) 
    {{ $v->stockdata->year }} 
@endforeach 
+0

谢谢:)我假设我做错了所有的答案指向相同的东西,但我得到了“尝试获取非对象的属性时{{print_r($ v-> stockdata->年)}}“ – mauzilla

+0

每个股票都有它的相关股票数据吗?如果是,你可以发布'dd($ v-> stockdata)的结果;'如果你把它作为foreach中的第一行。如果没有,你应该每次都做检查,比如'is_null($ v-> stockdata)? :$ v-> stockdata-> year'。 –

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(); 
    } 
} 

在contriller

public function getstock(Stock $stock) { 
    return view('vehicles.getstock', ['stock' => $stock->getStock]); 
} 

视图

@foreach ($stock as $k => $v) 
    {{ $v->stockdata->year }} 
@endforeach 
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