Mik*_*rys 3 php models laravel eloquent
我有三个模型都是一对多相关的.类别,子类别和风格.我有两种方式的关系 - 虽然我似乎在访问相关属性时遇到问题.
在我的查询运行之后,我留下了这个Style的实例,其中'relations'是Subcategory的一个实例,而Subcategory中的'relations'是Category的一个实例.这一切都是正确的.
问题是我现在似乎无法访问相关的模型实例.例如,如果我打电话:
$style->subcategory->name;
Run Code Online (Sandbox Code Playgroud)
我得到'试图获得非对象的财产'.所以我尝试只调用$ 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');
}
}
Run Code Online (Sandbox Code Playgroud)
子目录
<?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');
}
}
Run Code Online (Sandbox Code Playgroud)
样式
<?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');
}
}
Run Code Online (Sandbox Code Playgroud)
询问
$style->where($id, $item)->with('subcategory.category')->first();
Run Code Online (Sandbox Code Playgroud)
表
百诺肯\产品\目录
ID ...
1
2
Run Code Online (Sandbox Code Playgroud)
百诺肯\产品\子目录
ID Category ...
1 2
2 2
Run Code Online (Sandbox Code Playgroud)
百诺肯\产品\风格
ID Subcategory ...
1 1
2 1
Run Code Online (Sandbox Code Playgroud)
由于Style模型中的子类别方法应该引用Subcategory的单个实例而不是它们的Collection,我不应该像我(或者我想要的那样)调用属性吗?
Adr*_*ery 14
好的,我想我现在看到的是怎么回事.您的Eloquent模型称为子类别,但外键也是如此.所以当你打电话
$style->subcategory
Run Code Online (Sandbox Code Playgroud)
那就是返回外键而不是模型.要解决此问题,我建议将外键ID的名称更改为subcategory_id.如果您无法更改数据库,则可以通过将此方法链接到此类来强制它使用该模型
$style->subcategory()->first()->name
Run Code Online (Sandbox Code Playgroud)
编辑:另一个想法,你可以改变关系的名称
public function subcategory_item()
{
return $this->belongsTo('Paragon\Products\Subcategory', 'subcategory');
}
Run Code Online (Sandbox Code Playgroud)
然后你应该能够正确地引用它
$style->subcategory_item->name
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19708 次 |
| 最近记录: |