@Mariik

Почему метод belongsTo() не отрабатывает в модели Laravel?

Дано:
1. миграция на таблицу пользователей книг
Schema::create('books_users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('first_name');
            $table->string('last_name');
            $table->string("email");
        });

2. миграция на таблицу книг:
Schema::create('books', function (Blueprint $table) {
            $table->increments("id");
            $table->integer("book_user_id")->nullable()->unsigned();
            $table->string("author");
            $table->string("genre");
            $table->smallInteger("year")->unsigned();
            $table->string("title");
            $table->foreign('book_user_id')->references('id')->on('books_users');
        });

3. модель пользователей:
namespace App\Models\FrontEnd\Users;

use Illuminate\Database\Eloquent\Model;

class BookUser extends Model
{
    protected $table = 'books_users';
    protected $fillable = ['first_name', 'last_name'];
    public $timestamps = false;

    public function books(){
        return $this->hasMany('\App\Models\FrontEnd\Books\Book');
    }
}


4. модель книг:
class Book extends Model
{
    protected $table = 'books';
    protected $fillable = [
        'author',
        'genre',
        'year',
        'title',
        'book_user_id'
    ];
    public $timestamps = false;

    public function owner(){
        /*
            Вопрос:
            Почему тут мне приходится явно указывать колонку?
            В случае с моделью BookUser мне не приходилось это делать.
            В чем тут разница?
        */
        return $this->belongsTo('\App\Models\FrontEnd\Users\BookUser");
    }
}


связь между пользователем и кнгиой работает отлично, вот такой код вполне работает:

$x = new \App\Models\FrontEnd\Users\BookUser();
$res = $x->first();
dd($res->books->toArray());


Но вот связь между книгой и пользователем вообще не работает...
$y = new \App\Models\FrontEnd\Books\Book();
 $res = $y->first();
   dd($res->owner->toArray());


Единственное, что помогает, это явное указание колонки:
return $this->belongsTo('\App\Models\FrontEnd\Users\BookUser','id');


Как мне избавится от явного указания колонки? Ведь в случае с моделью пользователя мне не пришлось явно указывать имя колонки. почему?
  • Вопрос задан
  • 1038 просмотров
Решения вопроса 1
Denormalization
@Denormalization
Колонку надо в обоих случаях указывать явно.
Тот факт, что оно работает с указанием поля 'id' - всего лишь совпадение (так как, по всей видимости, просто совпали id), и в дальнейшем приведет к ошибкам.
В обоих случаях нужно явно указывать поле book_user_id, тогда все будет работать как нужно.

А указывать нужно потому что laravel в данном случае не может корректно вывести имя связи из названия таблицы.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы