从视图看,Laravel 5.3访问在elequant中有一个

从视图看,Laravel 5.3访问在elequant中有一个,laravel,laravel-5,eloquent,Laravel,Laravel 5,Eloquent,我试图从控制器传入的数据集合访问关系表。我可以在视图中迭代集合,但无法访问关系数据 共有两个表格: 股票(默认模型) 股票数据(具有已设置的外键股票id) 控制器: public function getstock() { return view('vehicles.getstock', ['stock' => \App\Stock::all()]); } 模型(App\Stock)然后(App\StockData) 查看(循环): @foreach ($st

我试图从控制器传入的数据集合访问关系表。我可以在视图中迭代集合,但无法访问关系数据

共有两个表格:

  • 股票(默认模型)
  • 股票数据(具有已设置的外键股票id)
控制器:

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

查看(循环):

@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)
但是,年份是stock_数据表中的一列

我还能够打印\App\StockData()表中的数据,因此对该表的引用是正确的,因为从控制器打印(\App\StockData::all())会按预期返回所有行

我做错了什么?

在对任何关系调用
get()
方法时,无论您有什么关系,您都将始终收到集合

至少有两(2)种方法可以解决您的问题:
1. <代码>$v->stockdata->year
2. <代码>$v->stockdata()->first()->year

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

祝你好运

既然是这样,你应该这样做:

@foreach ($stock as $v)
    {{ $v->stockdata->year }}
@endforeach
例如:

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]);
}
看法


首先,您必须更改
{{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

谢谢:)我尝试了您的选项,但在这两个方面都出现了以下错误:在执行{print_r($v->stockdata->year)}或{print_r($v->stockdata()->first()->year)}@mauzilla刚刚注意到,
$this->hasOne('App\StockDatas',id',stock_id')中有错误的关系键应该是
$this->hasOne('App\StockDatas','stock_id','id'),因为第一个键是外键,第二个键是本地键。谢谢:)我假设我做错了什么,因为所有的答案都指向同一件事,但我得到了一个“在执行{{print\u r($v->stockdata->year)}时尝试获取非对象的属性”每个股票都有它的相关股票数据吗?如果是,你能发布
dd($v->stockdata)的结果吗
如果您将其作为foreach中的第一行。如果不是,您应该每次都进行检查,比如
is\u null($v->stockdata)?:$v->stockdata->year
@foreach($stock as $one)
     {{ $one->stockadata()->first()->year }}
@endforeach
@foreach($stock as $one)
 {{ isset($one->stockadata()->first()) : $one->stockadata()->first()->year : 'Default' }}
@endforeach