【问题标题】:Accessing Eloquent relationship attributes访问 Eloquent 关系属性
【发布时间】:2015-11-22 02:58:49
【问题描述】:

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

在我的查询运行后,我留下了一个 Style 实例,其中“relations”是 Subcategory 的一个实例,而 Subcategory 中的“relations”是 Category 的一个实例。这是正确的。

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

$style->subcategory->name;

我得到“试图获取非对象的属性”。所以我尝试只调用 $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();

表格

典范\产品\类别

ID    ...
1
2

Paragon\Products\子类别

ID   Category    ...
1    2
2    2

典范\产品\风格

ID   Subcategory    ...
1    1
2    1

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

【问题讨论】:

  • 你是如何查询关系的?你的styles 表上有subcategory 列吗?它可能会返回该列的值而不是相关模型。
  • 你确定除了hasMany之外还设置了belongsTo关系吗?
  • 您需要向我们展示您的模型,以便我们为您提供帮助。
  • @user3158900 我愿意!这可能是问题..
  • @AdrianFlannery 我已经设置好了,见上文

标签: php laravel eloquent models


【解决方案1】:

我在这里在黑暗中拍摄。但我会尝试解释如何使用 collection 以及 first 和 get 之间的区别。

$users= $user-> with('images') -> first(); <-- this is first  row in the table users, each user has many images.
$users-> username; //works;

$users-> images-> image_name; // wont work , model has many ,    
you get error <-- Trying to get property of non-object. 
// access the proprety image and loop through the collection of objects.
$images = $user-> images; // 

foreach ($images as $image){
  echo $image- >image_name; 
}

另一方面,如果图像确实属于一个用户并且该用户有一个图像。您可以像这样访问 image_name

$user -> image(() -> image_name;

在你的情况下

$style -> subcategory() -> name;

通过带有子类别的 id 获取样式

$style -> with('subcategry') -> where('id', $styleId) -> first();

【讨论】:

  • 我正在尝试访问单个模型。 Style 有一个 Subcategory,但是 Subcategory 有很多 Styles。不过谢谢你的回答
【解决方案2】:

好的,我想我现在明白发生了什么。您的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 2023-04-01
    • 2020-07-03
    • 2017-02-17
    • 2017-04-02
    • 2020-02-08
    • 2018-08-12
    相关资源
    最近更新 更多