如何使用Eloquent获取具有外键的另一列的值

时间:2015-02-11 02:39:36

标签: laravel eloquent

我有两张桌子

Users
    -ID
    -Company
    -Name

Companies
    -ID
    -company_name

“公司”列中填入了“公司”表中公司的ID,如此

用户

----------------------
|ID | Name | Company |
----------------------
| 1 | Bob  | 1       |
| 2 | Mary | 1       |
| 3 | Sue  | 2       |


Comapnies
-------------------
|ID | company_name| 
-------------------
| 1 | Google      |
| 2 | Microsoft   |

如何通过公司ID的外键引用名称?

我的用户模型

public function company() {
        return $this->hasOne('Company');
    }

公司模式

   public function company() {
        return $this->belongsTo('User');
    }

如果我做了

$users = User::find(1);

我得到了公司的ID,但我需要得到这个名字。

我已经尝试了

 foreach ($users->company as $company){
        echo $company->company_name;
}

$users->company->company_name;

只会导致尝试获取非对象的属性

foreach ($users->company as $company)
    {
        echo $company->pivot->comapny_name;
    }

其中只说为foreach()提供的无效参数

我不确定该怎么做。

2 个答案:

答案 0 :(得分:1)

您的关系未正确定义。在您的代码中,您尝试将User定义为父级,将Company定义为子级。但是,您的表格设置为公司是父级,用户是子级。基本上,包含外键的表(users表具有公司的外键)应该在belongsTo端。

因此,代替用户hasOne公司和公司belongsTo用户,它需要切换到公司hasOne用户和用户所属的公司。

除此之外,您的外键与Laravel默认使用的命名约定不匹配,因此您需要在关系定义中指定外键。

用户:

public function company() {
    return $this->belongsTo('Company', 'Company');
}

公司:

public function user() {
    return $this->hasOne('User', 'Company');
}

一旦您的关系设置正确,您就可以:

$user = User::find(1);
var_export($user->company->company_name);

答案 1 :(得分:0)

我认为你需要把你的关系声明放在这样:

public function company() {
    return $this->hasOne('Company', 'Company');
}

Laravel relationships docs说这个

  

请注意 Eloquent假定关系的外键   基于型号名称 。在这种情况下,假设Phone模型使用a   user_id外键。如果您希望覆盖此约定,您可以   将第二个参数传递给hasOne方法。此外,你可以通过   方法的第三个参数,用于指定哪个本地列   应该用于协会