Laravel雄辩的几种关系

时间:2019-07-04 19:26:02

标签: laravel laravel-5 eloquent relationship

对于示例,我有三种简化的模型(用户请求获取电话):

  1. User

    • id
    • 登录
  2. Request

    • id
    • user_id
    • phone_id
  3. Phone

    • id
    • 名称

关系如下:

用户模型中:

public function requests()
{
    return $this->hasMany('App\Requests');
}

手机型号中:

public function phoneRequests()
{
    return $this->belongsTo('App\Requests');
    // But it returns null
}

我需要从我的用户模型开始收集一个收藏,并获得所有需要的电话(我需要那里的名字)。问题在于phone_id位于请求模型中,而在文档中则相反。

我找不到实现我目标的任何关系。

理想的情况是要经历以下关系:

Auth::user()->requests->phoneRequests
// Would returns the phone name the user has requested

我也尝试使用原始SQL查询来执行此操作,但我宁愿使用关系。该怎么做?

2 个答案:

答案 0 :(得分:1)

您应该在Requests模型中建立电话关系,例如:

public function phone()
{
    return $this->belongsTo('App\Phone');
}

现在,您可以像这样通过电话为用户获取所有请求:

$user->requests->first()->phone; // this is for the first request, but you can get the phone for each request in a loop, I guess you know how to do that.

还要注意,您在Phone模型中的关系是错误的,因此成为null的原因。那个应该再次具有User中的hasMany,因为根据您的表结构,电话可以有许多请求。

在您的Phone模型中,您应该这样:

public function requests()
{
    return $this->hasMany('App\Requests', 'phone_id');
}

因为根据您的数据库结构,一部电话可以属于许多请求。

答案 1 :(得分:0)

感谢newUserName02的评论,我的问题的解决方案是:

/**
 * Returns all requests made by this client
 * @return Collection
 */
public function requests()
{
    return $this->hasMany('App\Requests');
}

/**
 * Returns all the phones requested by the client
 * @return Collection
 */
public function phones()
{
    return $this->belongsToMany('App\Phone', 'phone_request');
    // where phone_request is the name of the pivot table (App\Requests)
}

此外,我邀请您咨询this excellent article(法语),它很好地解释了与模式的关系。