Laravel 自己模型上的父/子关系

Posted

技术标签:

【中文标题】Laravel 自己模型上的父/子关系【英文标题】:Laravel parent/children relationship on it's own model 【发布时间】:2015-10-13 21:35:12 【问题描述】:

我想获取所有至少有一个孩子的优惠券,一张优惠券可以有多个优惠券孩子,但任何优惠券只能有一个父母。

我用以下模型和调用设置它,它生成的查询是所需的,直到这部分:'vouchers'.'parent_id' = 'vouchers'.'id'

想要的功能:

$vouchers = Voucher::has('children')->get();

$vouchers = Voucher::has('parent')->get();

查询结果

select * from `vouchers` where `vouchers`.`deleted_at` is null 
and (select count(*) from `vouchers` where `vouchers`.`deleted_at` is null 
and `vouchers`.`parent_id` = `vouchers`.`id` 
and `vouchers`.`deleted_at` is null ) >= 1

型号:

class Voucher extends baseModel 

    public function parent()
    
        return $this->belongsTo('Voucher', 'parent_id');
        // return $this->belongsTo('Voucher', 'parent_id', 'id'); <- attempted but din't work
    

    public function children()
    
        return $this->hasMany('Voucher', 'parent_id');
    

【问题讨论】:

我以前在模型上使用过这种父子方法。你有什么问题? 它什么也不返回。即使我将 Laravel 生成的查询直接在数据库上运行。 由于这部​​分and 'vouchers'.'parent_id' = 'vouchers'.'id'——它在那个子查询中引用了自己。外部查询需要vouchers 上的别名。 您可以使用数据透视表吗? 此问题已在 5.0 github.com/laravel/framework/pull/8193 中报告并修复,遗憾的是版本 4 没有后端端口。 【参考方案1】:

此问题已在 5.0 https://github.com/laravel/framework/pull/8193 中报告并修复

不幸的是,版本 4 没有后端端口。

但是,如果您想自己应用修复程序,您可以在此处查看修改列表:https://github.com/laravel/framework/pull/8193/files

请注意,修改框架的代码库存在风险,但 Laravel 4.x 版本将不再修复错误,仅会再进行几个月的安全修复。

【讨论】:

以上是关于Laravel 自己模型上的父/子关系的主要内容,如果未能解决你的问题,请参考以下文章

laraver框架学习------工厂模型填充测试数据

Laravel,按最新创建的子关系排序模型

如何通过多对多关系获取与同一张表相关的行 - Laravel

从父多对多关系获取所有子模型 Laravel Eloquent

Laravel 模型关系上的计算字段,如模型属性

Laravel 5.1 - 具有空值的模型上的关系