Laravel 关系的三种方式

Posted

技术标签:

【中文标题】Laravel 关系的三种方式【英文标题】:Laravel relationship in three ways 【发布时间】:2022-01-20 05:11:03 【问题描述】:

我想定义一个相当独特的关系,但似乎找不到该关系的名称。

我的数据库结构如下:

user,填充了与本示例无关的数据 带有user_organisation.user_iduser_organisation.organisation_iduser_organisationorganisation,填充了与本示例无关的数据 一个 event 包含一个 event.organisation_id

我想定义user -> events 的关系。或者换句话说:用户所属的组织中的所有事件。

【问题讨论】:

查找 HasManyThrough 感谢回复,我也想到了。但是,这会尝试查找“organisation.user_id”列,该列不存在,因为用户-组织关系很多。 这个怎么样? ***.com/questions/37430217/… 这确实模仿了我正在寻找的行为,但我真的在寻找一个内置的 Laravel 解决方案,所有其他定义“关系”中断关键功能的方法,如 paginate . Laravel 似乎根本不支持这种关系类型,所以我坚持加入。无论如何感谢您的帮助。 在查询生成器中使用自定义函数。您将可以访问通常可以访问的所有内容,但没有“关系”包装器 【参考方案1】:

在您的用户模型中:

public function organisations()  
    return $this->belongsToMany(Organisation::model, 'user_organisation');

在您的组织模型中:

public function users()  
    return $this->belongsToMany(User::model, 'user_organisation');


public function events()  
    return $this->hasMany(Event::model);

在您的事件模型中:

public function organisation()  
    return $this->belongsTo(Organisation::model);

然后:

$user = User::find(1);
$organisations = $user->organisations;
foreach($organisations as $organisation)  
    $user_organisation_events = $organisation->events;

或者在你的用户模型中:

public function getAllEvents()  
    $events = new Collection();
    $organisations = $this->organisations;
    foreach($organisations as $organisation)  
        $events[] = $organisation->events();
    
    return $events;

因此 $user->getAllEvents() 应该返回与它们关联的所有组织的所有事件的集合。

编辑:

如果您想要返回一个 eloquent 对象而不是一个集合,您还可以添加一个如下所示的方法:

public function events()  
    $organisations = $this->organisations;
    return Event::query()->whereHas('organisations', function ($query) 
        $query->where('organisation_id', $organisations->pluck('organisation_id'));
    ); 

【讨论】:

这不允许我调用通常的关系函数,例如paginate()。是否没有本地 Laravel 关系可以促进我正在寻找的行为? 查看@jschpmr 所做的编辑,它返回一个雄辩的对象,然后您应该能够分页。

以上是关于Laravel 关系的三种方式的主要内容,如果未能解决你的问题,请参考以下文章

如何查看Laravel版本号的三种方法

Laravel 中的三种不同方法用于请求是不是请求 JSON。他们是一样的吗?有重叠吗?

laravel 工厂模式到容器

Laravel 使用自己的类库三种方式

第六章创建多对多关系的三种方式

Laravel 三种注入方式