Отношения 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');
}
}
Они содержат отношения для ваших моделей. Если вам нужно было выбрать несколько записей, для каждой записи вы можете получить пользователя и элемент. Если вы должны были выбрать элемент, и все записи для этого элемента. Вы также можете получить пользователя для каждой записи.