我有三个模型都是一对多相关的。类别,子类别和风格。我有两种方式的关系 - 虽然我似乎在访问相关属性时遇到问题。
在我的查询运行之后,我离开了这个Style的一个实例,其中'关系'是子类别和'关系的实例。在Subcategory中是Category的一个实例。这都是正确的。
问题是我现在似乎无法访问相关的模型实例。例如,如果我打电话:
$style->subcategory->name;
我得到'试图获得非对象的属性'。所以我尝试只调用$ style->子类别,结果是' 1'。
为什么$ style->子类别不返回子类别模型的实例?我错过了什么或者我的理解不正确吗?
- 编辑 -
模型
类别
<?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
帕拉贡\产品\子目录
ID Category ...
1 2
2 2
帕拉贡\产品\风格
ID Subcategory ...
1 1
2 1
由于Style模型中的子类别方法应该引用Subcategory的单个实例而不是它们的集合,我不应该像我(或者我想要的那样)调用属性吗? / p>
答案 0 :(得分:13)
好的我想我现在知道发生了什么。您的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
答案 1 :(得分:0)
我在黑暗中拍摄。但我会尝试解释如何处理收集和第一次和获得之间的区别。
$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;
通过subategoty
获取id样式$style -> with('subcategry') -> where('id', $styleId) -> first();