【问题标题】:Laravel 5.3 access hasone in elequant from viewLaravel 5.3 从视图中访问 elequant
【发布时间】:2016-11-10 15:33:21
【问题描述】:

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

有2张桌子:

  • 库存(默认模型)
  • stock_datas(具有已设置的外键 stock_id)

控制器:

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()) 确实将所有行返回为预计。

我做错了什么?

【问题讨论】:

    标签: laravel laravel-5 eloquent


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      当在任何关系上调用get() 方法时,无论你有什么关系,你总是会收到收集。

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

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

      祝你好运!

      【讨论】:

      • 谢谢 :) 我尝试了您的选项,但两者都出现以下错误:尝试在执行 {{ 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');,因为第一个键是外键,第二个是本地键。
      【解决方案3】:

      既然是one to one relation,你应该这样做:

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

      【讨论】:

      • 谢谢 :) 我认为我做错了什么,因为所有答案都指向同一件事,但我得到一个“尝试在执行 {{ print_r( $v->stockdata->year) }}"
      • 每只股票总是有它的相关股票数据吗?如果是,如果您将其作为第一行放在foreach 中,您能否发布dd($v->stockdata); 的结果。如果没有,您应该每次都进行检查,例如is_null($v->stockdata) ? : $v->stockdata->year
      【解决方案4】:

      例如:

      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
      

      【讨论】:

        猜你喜欢
        • 2022-08-15
        • 1970-01-01
        • 2023-03-06
        • 2017-05-21
        • 2017-05-07
        • 2017-03-26
        • 2017-03-13
        • 1970-01-01
        • 2017-04-06
        相关资源
        最近更新 更多