【问题标题】:Can't access nested object in blade template无法访问刀片模板中的嵌套对象
【发布时间】:2017-12-09 15:00:33
【问题描述】:

我使用 Laravel,Eloquent 用于查询,Blade 用于模板。

以下是我正在使用的模型:

namespace App;

use Illuminate\Database\Eloquent\Model;

class DistrictCharge extends Model
{
    protected $fillable = [ 'plan_year', 'location_id', 'meal_id', 'charge_id', 'price' ];

    public function plan_year() {
        return $this->belongsTo('App\PlanYear', 'plan_year');
    }
}


namespace App;

use Illuminate\Database\Eloquent\Model;

class PlanYear extends Model
{
    protected $fillable = [ 'year', 'start_date', 'end_date' ];

    public $primaryKey = 'year';
}

相关控制器代码:

public function index()
{
    $district_charges = DistrictCharge::with('plan_year')->get();

    return view('district-charges/index', compact(
        'district_charges',
    ));
}

在我的模板中,当我这样做时:

{{ $district_charges[0] }}

我明白了(为了可读性而缩进):

{
    "id":1,
    "created_at":"2017-01-23 21:33:53",
    "updated_at":"2017-01-23 21:33:53",
    "plan_year": {
        "year":2016,
        "start_date":"2015-07-01",
        "end_date":"2016-06-30",
        "created_at":"2017-01-23 21:03:08",
        "updated_at":"2017-01-23 21:03:08"
    },
    "location_id":"2",
    "meal_id":"1",
    "charge_id":"4",
    "price":"175"
}

这是有道理的; plan_year 字段填充了它所引用的数据库条目的内容,这正是我想要的。但是当我这样做时:

{{ $district_charges[0]->plan_year }}

我只是得到2016,一个非对象。这是一个问题,因为我查询是为了填充 plan_year 字段,因为我的视图需要 start_dateend_date 字段。当我尝试在我的视图中访问这些属性时,我只会收到“尝试获取非对象的属性”错误。我对 Laravel、Eloquent 或 Blade 不太熟悉,所以任何帮助都会很棒。

编辑:

按要求的表结构:

district_charges
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| created_at  | timestamp        | YES  |     | NULL    |                |
| updated_at  | timestamp        | YES  |     | NULL    |                |
| plan_year   | int(11)          | NO   |     | NULL    |                |
| location_id | int(11)          | NO   |     | NULL    |                |
| meal_id     | int(11)          | NO   |     | NULL    |                |
| charge_id   | int(11)          | NO   |     | NULL    |                |
| price       | int(11)          | NO   |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+

plan_years
+------------+-----------+------+-----+---------+-------+
| Field      | Type      | Null | Key | Default | Extra |
+------------+-----------+------+-----+---------+-------+
| year       | int(11)   | NO   |     | NULL    |       |
| start_date | date      | NO   |     | NULL    |       |
| end_date   | date      | NO   |     | NULL    |       |
| created_at | timestamp | YES  |     | NULL    |       |
| updated_at | timestamp | YES  |     | NULL    |       |
+------------+-----------+------+-----+---------+-------+

我没有得到的是为什么当我在模板中输出整个内容时我可以看到我想要的变量的内容,但是当我有选择地只输出它的一部分时,它说它不存在。

【问题讨论】:

  • 能把两张表的表结构贴一下吗?
  • 这看起来像一个 JSONString,这是刀片所期望的吗?
  • @RiggsFolly 这是当我转储整个变量时 Blade 的输出,所以我无法说明它是如何在内部处理的。我不明白的是为什么我可以看到整个变量,包括我想使用的嵌套对象,但是当我尝试访问该嵌套对象的属性时,我收到一个错误。

标签: php laravel eloquent blade


【解决方案1】:
 public function plan_year() {
    return $this->belongsTo('App\PlanYear', 'plan_year','year');
}

我相信年份是您表中的主键

我相信你的表中有数据,否则你会得到致命错误

$district_charges[0]->plan_year->start_date

为了显示结束日期,你需要做同样的事情

$district_charges[0]->plan_year-> end_date

【讨论】:

  • 我不确定你的意思。当我将{{ $district_charges[0]->plan_year->start_date }} 添加到我的模板时,我得到了同样的“试图获取非对象的属性”错误。
  • @keekeejeejee 我已经编辑了我的答案,请看一下
  • 我添加了您建议的return $this->belongsTo('App\PlanYear', 'plan_year','year');,但没有成功。
  • @keekeejeejee 请 DistrictCharge::with('plan_year')->toSql();看看它给了你什么?
  • 您的关系中有错误,这就是查询无法正常工作的原因
【解决方案2】:

表中没有任何 id,因此将以下类成员放入您的 PlanYear 模型中

protected $primaryKey = 'year';

另外,将您的关系方法更改为不带下划线 - 例如,year()

【讨论】:

  • 在我在 PlanYear 模型中使用 public $primaryKey = 'year'; 之前。我将其更改为protected,但得到了相同的结果。是否需要对表本身进行某种手动重组?
  • 如果不调试就很难找到错误,但我的假设是它与您将两个表链接到一个不是 id 的数字的事实有关。构建数据库的正确方法是在 play_year 表中添加一个增量 id,并将 year_id 字段放入 District_charges 表中。那么你的关系命令将是return $this->belongsTo('App\PlanYear') 并且你不需要覆盖模型的primaryKey
  • 这是有道理的(鉴于我对这个框架的了解有限),但很不幸,因为我希望我可以使用年份作为唯一标识符,并且可能会有点纠结要整理回去并重做该表和与之相关的其他表。
  • 模板显然可以以某种形式访问填充的plan_year 字段,因为当我将整个变量放入模板时它会输出整个内容。为什么会这样,为什么我不能直接访问它?
  • 我尝试填充和使用另一个字段 location_id,而 locations 表确实有一个正确的主键,我很确定我引用正确,并且我有确切的同样的事情发生。我可以查看整个对象,但是当我尝试获取嵌套对象的内容时出现错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
相关资源
最近更新 更多