Relationships Laravel OneToOne? [дублировать]


делаю друг упражнений, плюс есть но где не могу понять, почему это не работает, когда я делаю это другое имя метода. У меня есть метод в Model Location, где он делает relationships OneToOne.

Когда я вызываю метод с именем, просто, он работает, но когда я вызываю метод с именем состоит он из null.

Model Location

public function countryInverso()
{
    return $this->belongsTo(Country::class);
}

Controller OneToOne

public function umPraUmReverso()
{
    $location = Location::where('latitude', 54)->get()->first();
    $country = $location->countryInverso;
    dd($country);
}

Таким образом возвращает dd() null Теперь, если я ставлю таким образом

Model Location

public function country()
{
    return $this->belongsTo(Country::class);
}

Controller OneToOne

public function umPraUmReverso()
{
    $location = Location::where('latitude', 54)->get()->first();
    $country = $location->country;
    dd($country);
}

Таким ultima образом он возвращается ко мне данных, потому что имя метода countryInverso не работает, и только с именем country это работает?

Author: DNick, 2017-08-16

1 answers

Давайте рассмотрим, что документации Laravel о relationships может сказать нам, чтобы решить вашу проблему.

В отношениях One-to-One есть следующий пример:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

В приведенном выше примере Eloquent пытается объединить user_id model Phone id model User. Но как он это делает???

Eloquent предполагают, имя внешний ключ по умолчанию, взглянув на имя метода взаимоотношениями и только добавляет к имени метода _id. Это означает, что внешний ключ, чтобы Elloquent, содержащиеся в таблице, Phone в базе данных будет user_id.

Это является причиной вашей проблемы. Ваш внешний ключ является бостона, и работает только в том случае, если метод интерфейса при вызове country. Другого имени не будет работать. В данный момент вы изменили имя метода countryInverso Elloquent постановил, что имя ключ estrangeria было бы countryinverso_id и в поисках такого параметра в банк, чтобы ответ был null.

Как решить эту проблему?

Тем не менее, если ключа model Phone не user_id, вы можете передать имя ключа, настройка в качестве второго аргумента для метода belongsTo:

public function user()
{
    return $this->belongsTo('App\User', 'foreign_key');
}

Таким образом, вы можете работать имени метода, как вы хотите, и сохранить имя внешнего ключа, как вы. Его случай был бы так:

public function countryInverso()
{
    return $this->belongsTo(Country::class, 'country_id');
}
 1
Author: DNick, 2017-08-17 12:23:02