为了账号安全,请及时绑定邮箱和手机立即绑定

如何在laravel中创建3个模型之间的关系?

如何在laravel中创建3个模型之间的关系?

PHP
偶然的你 2021-06-10 18:19:02
SQL 方案:公告  id increment交易  id increment  seller_id  buyer_idDeals_items - 项目 = 公告  id increment  title  desc  bulletin_id  deal_id如何通过公告 ID 获取交易行?在原始 SQL 中,它看起来像:select `deals`.* from `deals` inner join `deals_items` on `deals_items`.`deal_id` = `deals`.`id` where `deals_items`.`bulletin_id` = 10572我试过了:public function deals(){    return $this->hasManyThrough(DealItem::class,Deal::class, 'bulletin_id','dealid','id');}但这似乎是一种错误的方式。在 Laravel 文档中找不到关于关系的正确方法。@HCK 显示正确的方式。但是当我在刀片模板中执行 $bulletin->deals() 时,我得到了空的交易集合。当只是 $bulletin->deal - 一切都很好时,我们有交易的集合。我在公告模型中使用了受保护的 $with = ['deals'],但有什么不同的调用方法或属性?为什么方法为空结果?
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

试试这个:


交易.php


public function bulletins()

{

    return $this

        ->belongsToMany(Bulletin::class, 'deals_items', 'deal_id', 'bulletin_id')

        ->withPivot('title','desc');

}

公告.php


public function deals()

{

    return $this

        ->belongsToMany(Deal::class, 'deals_items', 'bulletin_id', 'deal_id')

        ->withPivot('title','desc');

}

从文档:


如前所述,为了确定关系连接表的表名,Eloquent 将按字母顺序连接两个相关模型名称。但是,您可以随意覆盖此约定。您可以通过向该belongsToMany方法传递第二个参数来实现 :


return $this->belongsToMany('App\Role', 'role_user');

除了自定义连接表的名称之外,您还可以通过向belongsToMany方法传递附加参数来自定义表上键的列名。第三个参数是您在其上定义关系的模型的外键名称,而第四个参数是您要加入的模型的外键名称:


return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');

更新

当您将关系作为方法$bulletin->deals()访问时:您正在访问关系本身。这将返回\Illuminate\Database\Eloquent\Relations\BelongsToMany(在您的情况下)的实例。此处查询尚未执行,因此您可以继续向查询添加约束,例如:


$bulletin

    ->deals()

    ->where('seller_id', 45) // <---

    ->skip(5) // <---

    -> ... (And so on)

当您将其作为动态属性访问时,您已经在执行查询,因此这将返回一个Collection实例。与将关系作为方法调用然后->get()在末尾附加,所以这两个是等价的:


$bulletin->deals()->get()

// equals to:

$bulletin->deals

检查这个其他答案,它回答了你的问题。


查看完整回答
反对 回复 2021-06-25
?
智慧大石

TA贡献1946条经验 获得超3个赞

交易等级:


public function bulletins()

    return $this->belongsToMany('App\Bulletin', 'deals_items ', 'bulletin_id', 'deal_id')->withPivot('title','desc');

}

公告类:


public function deals()

    return $this->belongsToMany('App\Deal', 'deals_items ', 'deal_id', 'bulletin_id')->withPivot('title','desc');

}


查看完整回答
反对 回复 2021-06-25
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

交易模式 -


public function bulletins()

    return $this->belongsToMany(Bulletin::class, 'deals_items ', 'bulletin_id', 'deal_id');

}

公告模式:-


public function deals()

{

    return $this

        ->belongsToMany(Deal::class, 'deals_items',  'deal_id', 'bulletin_id',);

}


查看完整回答
反对 回复 2021-06-25
  • 3 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信