eloquent 模型的正确关系

Right relation for eloquent model

经过多次尝试,我无法做出 eloquent "relations" 作品。

我使用 MySQL Workbech 创建了一个数据库,其中包含以下 tables:

他们的关系图:

在 PHP 中,我有以下代码(摘要):

class ActorData extends Model
{
    protected $table = 'actordata';

    [..]

    public function nationality()
    {
        return $this->hasOne("App\Models\ActorData\Nationality");
    }
}

class Actor extends Model
{
    protected $table = 'actors';

    [..]

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

我的目标是,当我调用“->nationality”时,我希望它使用 "nationality",但我收到 "null" 或关于 "keys" 的错误未找到。

$actorData = \App\Models\Actor::find(1)->actorData()->first();
var_dump($actorData->nationality);

我明白 "hasOne" 在 "nationality" 中查找密钥,但我想做一个简单的 "link"。 作为另一种解决方案,我可以简单地使用 "Nationality_Id" 并在 "Nationality" table 中查找它,但我认为这是一种错误的方法。

希望我已经详尽无遗,感谢您的合作。

(为了 "fix" 我必须添加“$actorData->nationality()->associate($nationality))

你们的关系应该像上面那样。

其中 actorData 是其他 2 个 table 的枢轴 table。

您的 类 应如下所示:

class Actors extends Model{
    public function nationality() {
        return $this->belongsToMany(Nationality::class);
    }
}

class Nationality extends Model {
    public function actors() {
        return $this->belongsToMany(Actors::class);
    }
}

您基本上是在看 Many-to-Many。每个演员可以有多个国籍,同时每个国籍可以属于多个演员。

通常 laravel 期望枢轴 table 的名称类似于 actor_nationality,但您可以指定 table 名称:

return $this->belongsToMany(ModelClassGoesHere, 'PIVOT TABLE GOES HERE', 'FIRST TABLE ID', 'SECOND TABLE ID');

为什么不能把nationality_id直接放在actorstable上面,因为他们只能有一个。那么你们在 Actor 上的关系就是

public function nationality() {
    return $this->hasOne(Nationality::class);
}

那么你可以$actor->nationality;

您的国籍 class 将是...

class Nationality extends Model {
    public function actors() {
        return $this->hasMany(Actor::class);
    }
}