Отношения Laravel 4 с 3 таблицами с использованием Eloquent

Я хочу установить связь с 3 таблицами, используя ORM, но не могу. Мои столы

Таблица пользователей

id | userame | name |
 1    Ellie    Elen
 2    Pol      Paul

таблица рекордов

id | user_id| item_id| hour|
 1    2         1       3
 2    2         2       5

Таблица предметов

id |  title 
 1    item 1  
 2    item 2

Я использую эту логику, но не работаю должным образом

class User Extends Eloquent {

  public function record()
   {
    return $this->hasMany('VolunteerRecord');
   }

}


class VolunteerRecord Extends Eloquent {

    function item() {
        return $this->hasMany('VolunteerItem');
    }

}

Я не могу понять, как это сделать?

3 ответа

Похоже, вы хотите отношения между многими и многими Users а также Items но вы также хотите отслеживать часы на сводной таблице. Итак, сначала вы определите отношения "многие ко многим", используя belongsToMany(), и вы скажете Laravel, что у вас есть дополнительные данные в сводной таблице с withPivot() функция. Ваши занятия будут выглядеть так:

class User extends Eloquent {
    protected $table = 'users';

    public function items() {
        return $this->belongsToMany('Item', 'records')->withPivot('hour');
    }
}

class Item extends Eloquent {
    protected $table = 'items';

    public function users() {
        return $this->belongsToMany('User', 'records')->withPivot('hour');
    }
}

Затем, чтобы получить доступ к hour поле вы бы сделали это:

$user = User::first(); // First User
$item = $user->items()->first(); // User's first Item
$hour = $item->pivot->hour; // The 'hour' on the User-Item relationship

Кроме того, ваша текущая схема именования столбцов верна для Laravel, поэтому не думайте, что вам нужно ее изменить. Если вы измените имена столбцов, вам нужно определить их в belongsToMany() метод как это:

$this->belongsToMany('ModelName', 'pivot_table', 'foreign_key', 'other_key');

// For example, in Items::users() you would have this:
$this->belongsToMany('User', 'records', 'users_id', 'items_id');

Наконец, я предполагаю, что ваши таблицы названы users, items, а также records, Если это не так, просто замените все экземпляры users, items, а также records с вашими реальными именами таблиц.

В пользовательской модели

public function images()
{
    return $this->belongsToMany('Item')->withPivot('hour');
}

В пользовательском контроллере

public function view($username)
{
    $user = User::where('name',$username)->firstOrFail();
    return View::make('view')->with('user',$user);
}

Ввиду

    @foreach ($users->items as $item)
        name: {{$image->title}}<br>

        hour: {{$image->pivot->hour}}<br>
    @endforeach

Исходя из названий вашей таблицы, я бы предложил, прежде всего, изменить таблицу записей следующим образом:

id | users_id| items_id| hour|
 1    2         1       3
 2    2         2       5

И вот классы для ваших моделей:

class Users extends Eloquent
{
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    public function records()
    {
        return $this->hasMany('Records');
    }
}


class Records extends Eloquent
{
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'records';

    public function record()
    {
        return $this->hasOne('Users');
    }

    public function item()
    {
        return $this->hasOne('Items');
    }
}

class Items extends Eloquent
{
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'items';

    public function records()
    {
        return $this->hasMany('Records');
    }
}

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

Другие вопросы по тегам