Проблемы с загрузкой Laravel 4 с отношениями

У меня есть две таблицы, элементы и пользователи. У Пользователя может быть несколько Предметов, а Предмет может принадлежать одному Пользователю.

Мои две таблицы имеют много полей, но связаны:

Item
----
ownerID

User
----
id

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

Вот укороченная версия двух моделей:

class Item extends Eloquent {
    public function owner()
    {   
        return $this->belongsTo('User','id');
    }
}

class User extends Eloquent implements UserInterface, RemindableInterface {
    public function items()
    {
        return $this->hasMany('Item', 'ownerID');
    }
}

Итак, я хочу получить все свои предметы и нетерпеливо загрузить владельца. Это мой код в моем контроллере:

class ItemsController extends BaseController {
    public function all(){
        $items = Item::with('owner')->get();
        return $items;
    }
}

(Я возвращаю $items, чтобы я мог отладить вывод)

Тем не менее, это то, что я получаю в качестве вывода:

[
    {
        "active":"1",
        "categoryID":"1",
        "created_at":"0000-00-00 00:00:00",
        "description":"Just a test item",
        "endDate":"2014-03-01 21:46:07",
        "id":"32",
        "name":"Test Item",
        "owner":null,
        "ownerID":"1",
        "section":"0",
        "updated_at":"0000-00-00 00:00:00"
    }
]

Я не понимаю, почему владелец равен нулю? В моей базе данных существует идентификатор пользователя 1, так почему он нулевой?


person Jamesking56    schedule 01.02.2014    source источник


Ответы (2)


В соответствии с вашей функцией в Item

public function owner()
{   
    return $this->belongsTo('User','id');
}

Это указывает на то, что foreign key в таблице items — это id, который используется для связи с таблицей users, но вы использовали ownerId в качестве foreign key в таблице items, которая является primary key таблицы users.

Итак, это должно быть

public function owner()
{   
    // This model (child) with a local-key/field ownerId
    // in it's corresponding table(items) belongs to/relates to the
    // user model (parent) with primary-key id in corresponding (users) table
    return $this->belongsTo('User','ownerID');
}

При использовании belongsTo/reverse вторым аргументом, передаваемым функции, является ссылочный ключ (дочерний ключ/локальный ключ) в текущей таблице, и здесь items — это текущая таблица, которая имеет ссылочный ключ ownerId, так как local-key относится к id. поле таблицы users.

person The Alpha    schedule 02.02.2014

Попробуй это

class Item extends Eloquent {
    public function owner()
    {   
        return $this->belongsTo('User','ownerID');
    }
}
person dimirc    schedule 02.02.2014