Laravel 雄辩的一对一通过(级别/树)关系

Posted

技术标签:

【中文标题】Laravel 雄辩的一对一通过(级别/树)关系【英文标题】:Laravel eloquent one to one through (level/tree) relationship 【发布时间】:2014-01-14 21:55:33 【问题描述】:

嗨,我是 laravel 的新手(雄辩)。我正在尝试使用雄辩的 ORM 建立 一对一的(级别/树)关系。我有product_category 表有idparent_id

这是我的product_category

|-----|--------|-----------|
| id  |  name  | parent_id |
|-----|--------|-----------|
|  1  |  book  |     0     |
|  2  |notebook|     1     |

这是我的product

|----|----------------|-------------|
| id | name           | category_id |
|----|----------------|-------------|
|  1 | super notebook |      2      |

我希望能够仅从产品中的 subcategory_id 信息中提取父类别信息。这可能吗?

使用 SQL 时,这是查询(假设 category_id 为 2)

SELECT * FROM  `product_category` WHERE  `id` = (SELECT  `parent_id`  FROM `product_category`  WHERE  `id` =  '2' )

更新:

这是我当前的实现

<?php

    class Product extends Eloquent 

        public function subcategory()
        
            return $this->hasOne('ProductCategory');
        

        public function category()
        
            // This should get the parent info of the subcategory
            return ProductCategory::find($this->subcategory->parent_id);
        

    

【问题讨论】:

【参考方案1】:

基本的 1-2-1 关系是这样完成的:

产品型号

class Product extends Eloquent 

    public function category()
    
        return $this->hasOne('Category');
    


类别模型

class Category extends Eloquent 

    public function product()
    
        return $this->belongsTo('Product');
    


现在您可以像这样查询数据:

Product::find(1)->category;

生成的 SQL:

select * from products where id = 1

select * from categories where product_id = 1

基本上你应该重命名你的列以匹配 laravel 默认值,否则设置像 $this-&gt;hasOne('Category', 'foreign_key'); 这样的键

See docs also

【讨论】:

我已经做到了,问题是这种关系只适用于子类别。我希望关系通过类别(与子类别本身在同一个表中)。抱歉,如果它相当混乱,您可以查看我的示例表以更好地理解

以上是关于Laravel 雄辩的一对一通过(级别/树)关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 雄辩的一对多关系

Laravel 5.4雄辩的一对多关系

laravel 雄辩的关系一对多返回 null

Laravel 雄辩的关系多对一不起作用

在 laravel 中具有雄辩关系的更新期间从空值创建默认对象

#ASK Laravel 深厚的口才关系,来自患者一对多注册一对一综合诊所