设置和虚拟数据
我有一个名为Category的简单模型,它具有以下模式:
|----------------------------------------------|
| cat_id | cat_name | parent_id |
|----------------------------------------------|
| 1 | Home | 0 |
|----------------------------------------------|
| 2 | Products | 1 |
|----------------------------------------------|
| 3 | Services | 1 |
|----------------------------------------------|
| 4 | Product A | 2 |
|----------------------------------------------|
| 5 | Product B | 2 |
|----------------------------------------------|
所需的输出
所以你可以看到我们将得到一个非常直接的层次结构,如下所示:
Home
- Products
- Product A
- Product B
- Services
问题
我正在尝试在Laravel 4.2中映射这种关系,以便我可以查询模型并获取其父项(它将始终具有父项)和子项类别(如果它们存在) .
我使用以下方法在Category模型中定义了关系:
public function children()
{
return $this->hasMany('Category', 'parent_id', 'cat_id');
}
public function parent()
{
return $this->belongsTo('Category', 'parent_id');
}
问题
我可以使用,让父名称正常工作
$category = Category::findOrFail($id);
return $category->parent->cat_name;
但是,我不明白如何获取子对象 .
我试过了:
$category = Category::findOrFail($id);
$children = $category->children();
但是当我dd($ children)它没有输出我所期望的 .
1 回答
调用关系函数(
->children()
)将返回关系类的实例 . 您需要调用get()
或只需使用该属性:进一步说明
实际上
children()
和children
是完全不同的东西 .children()
只调用您为关系定义的方法 . 该方法返回HasMany
的对象 . 您可以使用它来应用更多查询方法 . 例如:现在访问 property
children
的工作方式不同 . 你从未定义它,所以Laravel在后台做了一些魔术 .我们来看看
Illuminate\Database\Eloquent\Model
:当您尝试访问实际不存在的PHP对象上的属性时,将调用
__get
函数 .然后在
getAttribute
中首先是一些检查"normal"属性然后返回的代码 . 最后,在方法结束时,如果存在定义的关系方法,则调用getRelationshipFromMethod
.然后它将检索关系的结果并返回该结果 .