我有三个模型都是一对多的。类别、子类别和样式。我有双向工作的关系 - 尽管我似乎在访问相关属性时遇到问题。

在我的查询运行后,我留下了一个 Style 实例,其中“关系”是子类别的一个实例,而子类别中的“关系”是类别的一个实例。这是正确的。

问题是我现在似乎无法访问相关的模型实例。例如,如果我打电话:

$style->subcategory->name;

我得到'试图获得非对象的属性(property)'。所以我尝试只调用 $style->subcategory,结果是“1”。

为什么 $style->subcategory 不返回子类别模型的实例?我错过了什么还是我的理解不正确?

--编辑--

模型

类别
<?php

namespace Paragon\Products;

use Illuminate\Database\Eloquent\Model as Eloquent;

class Category extends Eloquent {

    protected $table = 'product_categories';

    protected $fillable = [
            'name',
            'slug',
            'image'
    ];

    public function subcategories() {
            return $this->hasMany('Paragon\Products\Subcategory', 'category');
    }

}

子类
<?php

namespace Paragon\Products;

use Illuminate\Database\Eloquent\Model as Eloquent;

class Subcategory extends Eloquent {

    protected $table = 'product_subcategories';

    protected $fillable = [
            'category',
            'name',
            'slug',
            'image'
    ];

    public function styles() {
            return $this->hasMany('Paragon\Products\Style', 'subcategory');
    }

    public function category() {
            return $this->belongsTo('Paragon\Products\Category', 'category');
    }

}

风格
<?php

namespace Paragon\Products;

use Illuminate\Database\Eloquent\Model as Eloquent;

class Style extends Eloquent {

    protected $table = 'product_styles';

    protected $fillable = [
            'subcategory',
            'name',
            'slug',
            'image'
    ];

    public function subcategory() {
            return $this->belongsTo('Paragon\Products\Subcategory', 'subcategory');
    }

}

查询
$style->where($id, $item)->with('subcategory.category')->first();



Paragon\产品\类别
ID    ...
1
2

Paragon\产品\子类别
ID   Category    ...
1    2
2    2

Paragon\产品\风格
ID   Subcategory    ...
1    1
2    1

由于 Style 模型中的 subcategory 方法应该引用 Subcategory 的单个实例而不是它们的 Collection,所以我不应该能够按照我(或正在尝试)的方式调用属性吗?

最佳答案

好的,我想我现在明白发生了什么。您的 Eloquent 模型称为子类别,但外键也是。所以当你打电话

$style->subcategory

那是返回外键而不是模型。要解决此问题,我建议将外键 ID 的名称更改为 subcategory_id。如果您无法更改数据库,则可以通过将方法与类似的内容链接来强制它使用该模型
$style->subcategory()->first()->name

编辑:
另一个想法,您可以将关系的名称更改为类似
public function subcategory_item()
{
  return $this->belongsTo('Paragon\Products\Subcategory', 'subcategory');
}

那么你应该能够正确地引用它
$style->subcategory_item->name

关于php - 访问 Eloquent 关系属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32254259/

10-14 19:16
查看更多