Правильное отношение для красноречивой модели - PullRequest
0 голосов
/ 15 ноября 2018

После нескольких попыток я не могу заставить красноречивую «связь» работать.

Я создал базу данных с MySQL Workbech, которая содержит следующие таблицы:

  • Актеры
  • ActorData
  • Национальность

Их отношение изображения:

relationship

В 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');
    }
}

Моя цель, когда я звоню «-> национальность», я хочу, чтобы она принимала «национальность», но я получаю «ноль» или ошибки, связанные с «ключами»не найден.

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

Я понимаю, что "hasOne" ищет ключ в "национальности", но я хотел сделать простую "ссылку".В качестве другого решения, я мог бы просто взять «Nationality_Id» и найти его в таблице «Nationality», но я думаю, что это неправильный подход.

Надеюсь, я был исчерпывающим, спасибо за ваше сотрудничество.

(чтобы «исправить», мне пришлось добавить «$ actorData-> nationality () -> associate ($ национальность))

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Почему вы не можете поместить nationality_id непосредственно в таблицу actors, поскольку у них может быть только один. Тогда ваши отношения на Actor будут

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

Тогда вы могли бы сделать $actor->nationality;

Ваш класс национальности будет ...

class Nationality extends Model {
    public function actors() {
        return $this->hasMany(Actor::class);
    }
}
0 голосов
/ 15 ноября 2018

enter image description here

Ваши отношения должны выглядеть примерно так, как указано выше.

Где actorData - сводная таблица для двух других таблиц.

Ваши занятия должны выглядеть так:

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

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

Вы в основном смотрите на Многие ко многим . Где каждый актер может иметь много национальностей, в то же время каждая национальность может принадлежать многим актерам.

Обычно laravel ожидает, что сводная таблица будет иметь имя, подобное actor_nationality, но вы можете указать имя таблицы:

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