使用自定义主键的一对多关系

One to Many relationship using custom primary keys

我有 3 个 table:用户(id:主键)、招聘人员(user_id:主键和外键)和公司(id:主键)。 发生的情况是,招聘人员只是具有其他一些列的用户,基本上他是与应用程序交互的人。

由于只能有一个招聘人员与用户 table 关联,我决定使用 user_id 作为 FK 和 PK。 公司和招聘人员之间是一对多的关系,一个公司可以有很多招聘人员。

我正在尝试将招聘人员与一家公司相关联,但我做不到。

我正在使用 tinker 尝试实现这些功能。 我做的基本上是

$recruiter->company()->associate($company)
$recruiter-> save;

我得到 true 作为输出以及

App\Models\Recruiter {#4536
     user_id: 4,
     created_at: "2022-04-30 18:07:25",
     updated_at: "2022-04-30 18:07:25",
     company_id: null,
     company: App\Models\Company {#4544
       id: 1,
       created_at: "2022-04-30 17:48:48",
       updated_at: "2022-04-30 17:48:48",
       name: "Apple",
       company_image: "apple.png",
       short_description: "Electronics company",
       long_description: "Long description for electronics company",
       email: "apple@gmail.com",
       establishment_year: "1950-01-01",
       website_url: "www.apple.com",
       location: "United States of America",
       followers_count: 0,
       company_size: 0,
     },
   }

如您所见,公司以某种方式关联,但 company_id 未更新。 这些是模型

用户

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Model
{
    
    use HasApiTokens, HasFactory, Notifiable;

    public function recruiter() 
    {
        return $this->hasOne('App\Models\Recruiter');
    }
}
 

招聘人员

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Recruiter extends Model
{
    use HasFactory;
    
    public function user()
    {
        return $this->belongsTo('App\Models\User');
    }

    public function company()
    {
        return $this->belongsTo('App\Models\Company', 'company_id', 'user_id');
    }
}

公司

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Company extends Model
{
    use HasFactory;

    public function recruiters() 
    {
        return $this->hasMany('App\Models\Recruiter', 'company_id', 'user_id');
    }
}

招聘人员模型中的公司关系存在错误:

而不是:

public function company()
{
    return $this->belongsTo('App\Models\Company', 'company_id', 'user_id');
}

应该是

public function company()
{
    return $this->belongsTo('App\Models\Company', 'company_id', 'id'); //or return $this->belongsTo('App\Models\Company', 'company_id');
}

BelongsTo 关系语法为

return $this->belongsTo(ParentModel::class, 'foreign_key', 'owner_key');

哪里

foreign_key 是 child model/table 上的外国 ID 列('company_id' 在招聘人员 table 中)。

owner_key 是 parent model/table 上的主键或引用列(在这种情况下,公司 table 上的 'id' 列)

您遇到的问题是因为没有关于公司 table 的 'user_id' 列。

进一步参考:https://laravel.com/docs/9.x/eloquent-relationships#one-to-one-defining-the-inverse-of-the-relationship