如何在 Laravel 中从多对多关系的一对多关系中获取项目?

Posted

技术标签:

【中文标题】如何在 Laravel 中从多对多关系的一对多关系中获取项目?【英文标题】:How to get items from many to many relationships' one to many relationship in Laravel? 【发布时间】:2016-07-20 17:04:51 【问题描述】:

我有两个关系:

    Agents(many)-to-Properties(many) 关系(使用数据透视表)。 Properties(one)-to-Images(many) 关系(无数据透视表)。

所以一个Agent可以有10个Properties,每个Property会有10个Image;因此,Agent 有 100 张图像。 (我不想在代理和图像之间建立关系)。

是否有可以让我获取代理的所有图像的查询?

类似于$agent->properties()->images()->get()的东西

【问题讨论】:

【参考方案1】:

你可以使用 hasManyThrough https://laravel.com/docs/5.1/eloquent-relationships#has-many-through

在您的代理模型中:

public function images()

    return $this->hasManyThrough('App\Images', 'App\Properties');

然后就可以使用了

$agent->images()->get();

【讨论】:

只有当中间关系为hasOnehasMany时,才能使用hasManyThrough。在这种情况下,中间关系是belongsToMany,所以hasManyThrough将不起作用。【参考方案2】:

那么,两个查询怎么样:

<?php

$agent = new Agent();
$image = new Image();
$propertyIds = $agent->properties()->lists('id');
$images = $image->newQuery()->whereIn('property_id', $propertyIds)->get();

【讨论】:

【参考方案3】:

hasManyThrough('App\Image', 'App\Property') 如果您与 1-Many 关系存在 1-Many(或 1-1)关系,则有效。但在我的特定场景中,我有一个多对多关系(带有枢轴)到一对多关系。

我最终使用了这个语句。也许这对某人有用:

SELECT images.* FROM `agent_property` INNER JOIN images 
    ON agent_property.property_id = images.property_id 
WHERE agent_property.agent_id = '1'

相当于:

return DB::table('agent_property')->join('images', 'agent_property.property_id', '=', 'images.property_id')->where('agent_property.agent_id', $this->id)->select('images.*');

【讨论】:

以上是关于如何在 Laravel 中从多对多关系的一对多关系中获取项目?的主要内容,如果未能解决你的问题,请参考以下文章

如何从多对多关系中只加载 1 个结果 Laravel

从多对多关系中获取核心数据

如何从多对多表中选择一对一关系

Django 从多对多关系中删除对象

从多对多关系中获取结果

使用实体框架从多对多关系中选择数据