如何将3个表与Laravel的雄辩关系与渴望加载连接起来?

如何将3个表与Laravel的雄辩关系与渴望加载连接起来?,laravel,eloquent,eager-loading,laravel-5.7,eloquent-relationship,Laravel,Eloquent,Eager Loading,Laravel 5.7,Eloquent Relationship,因此,订单有一个外键offer\u id 并且报价有一个外键项目id 一个项目可能有多个报价。但每个报价都有一个项目 报价可以是多个订单。但每个订单都有一个报价 当我这样做时: $orders = Auth::user()->orders() ->with('offer') ->get(); 我明白了: id: 3, user_id: 1, offer_id: 5, created_at: "2019-02-15 00:40:3

因此,订单有一个外键offer\u id

并且报价有一个外键项目id

一个项目可能有多个报价。但每个报价都有一个项目

报价可以是多个订单。但每个订单都有一个报价

当我这样做时:

$orders = Auth::user()->orders()
            ->with('offer')
            ->get();
我明白了:

id: 3,
user_id: 1,
offer_id: 5,
created_at: "2019-02-15 00:40:31",
updated_at: "2019-02-15 00:40:31",
offer: {
    id: 5,
    item_id: 3,
    created_at: "2019-02-15 00:39:40",
    updated_at: "2019-02-15 00:39:40"
}
正如你所看到的,我可以得到这个报价的商品编号:3 但我想得到整个项目;它的所有列,而不仅仅是id

通常,您将连接这两个表。 如何做到这一点与雄辩

以下是我雄辩的人际关系:

命令

提议

项目


如果你所说的食物是指订单中的物品,那么:

$orders = Auth::user()->orders()
            ->with('offer', 'offer.orders', 'offer.item')
            ->get();
在下面,您将看到嵌套的即时加载:

要加载嵌套关系,可以使用点语法。例如,让我们把这本书的所有作者和作者的所有个人联系都放在一个雄辩的陈述中:

$books=App\Book::with'author.contacts'->get

在您的例子中,我们可以使用关系之间的点表示法得到嵌套的关系

$orders = Auth::user()->orders()
            ->with(['offer', 'offer.item'])
            ->get();

来自@Mihirbhande和@swonder的答案都指向了正确的方向

它确实应该是:

$orders = Auth::user()->orders()
            ->with('venue')
            ->with('offer.item')
            ->get();
或者同样的事情:

$orders = Auth::user()->orders()
            ->with(['venue', 'offer.food'])
            ->get();
但报价和项目模型之间的关系应该颠倒:

提议

项目


我收到对模型[App\Order]上未定义的关系[items]的RelationNotFoundException调用。项目中的items关系在哪里,是否在Order模型中?请查看更新的说明。我添加了关系。仍然不起作用:SQLSTATE[42S22]:未找到列:1054未知列“items.offer\u id”在“where子句”中SQL:select*from items`where items.offer\u id在2,4,5`中从我看到的情况来看,它试图在items中查找不存在的offer\u id。应该是相反的。那么,这些关系可能是错误的?您已经在报价模型中指定了一个关系,该关系将预期为item_id列。桌子的结构是什么样的?你的意思是提供。物品不是提供。订单,对吗?它仍然不起作用-RelationNotFoundException调用[App\Offer]模型上未定义的关系[items]。您说Offer有订单,order有项目。因此,获得物品将是offer.orders.items。在订单模型上,必须定义与项目模型的关系。这可能是一美元->似乎有很多。如果订单可以有许多项目。否。订单有报价,报价有商品。请看一下我在描述的前两行中给出的外键,同时我将其更新为包含代码中的关系。我的坏消息是,我读错了,所以应该是order.offers.items。我已经更新了上面的答案,应该可以了。只要您的报价模型与物品有关系。@学徒,它不会是物品,它只会是物品,因为您的关系只有一个。请看我最新的答案。
$orders = Auth::user()->orders()
            ->with(['offer', 'offer.item'])
            ->get();
$orders = Auth::user()->orders()
            ->with('venue')
            ->with('offer.item')
            ->get();
$orders = Auth::user()->orders()
            ->with(['venue', 'offer.food'])
            ->get();
public function item()
{
    return $this->belongsTo(Item::class);
}
public function offers()
{
    return $this->hasMany(Offer::class);
}