2016-02-02 6 views
1

Я получаю все предметы, принадлежащие аутентифицированному пользователю.Laravel упрощает вывод вложенных отношений

$ items = Auth :: user() -> with ('items') -> get();

На мой взгляд, я могу получить доступ к коллекции элементов, но вместо title_id хочу получить значение item_title. В настоящее время я нахожусь в состоянии получить ITEM_TITLE значение, используя код ниже:

$ item-> Заголовок-> название

Можно ли упростить ее, чтобы получить титул, как это: $ item-> титул ?

Вот мои модели и отношения:

Users 
    id 
    username 
Item 
    id 
    user_id 
    title_id 
Item_Titles 
    id 
    title 

модель Пользователь:

public function items() 
    { 
     return $this->hasMany('Item', 'user_id', 'id'); 
    } 

товара модель:

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

public function title() 
{ 
    return $this->belongsTo('ItemTitle','title_id','id'); 
} 

ItemTitle модель:

public function item() 
{ 
    return $this->hasMany('Item', 'title_id', 'id'); 
} 

UPDATE

Простите, наверное, я не был ясен. Если быть точным - я просто хочу найти альтернативную альтернативу:

$items=Item::where('user_id','=',Auth::id())->leftJoin('item_titles', 'item.title_id', '=', 'item_titles.id')->get(); 

@foreach ($items as $item) 
    {{ $item->title }} 
@endforeach 

ответ

2

Да, это так. Похоже, вы настраиваете отношения «многие ко многим» с моделью Item, являющейся сводной таблицей.

пользователя Модель

public function titles() 
{ 
    return $this->belongsToMany('ItemTitle', 'items'); 
} 

Примечание: Изменение ItemTitle для правильного пространства имен. Также измените items на имя таблицы модели Item.

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

ItemTitle Модель

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

Оттуда вы можете получить все заверенный пользователя ItemTitles так:

$titles = Auth::user()->titles; 

Ссылка на документацию: https://laravel.com/docs/5.1/eloquent-relationships#many-to-many

Редактирование на основе комментариев ниже (спасибо за помощь @ash уточнения и за его предложение):

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

$items=Auth::user()->with('items')->get(); 

Это возвращает всех пользователей с загруженными позициями. Чтобы убедиться в этом, если вы dd($items), вы, скорее всего, увидите каждого пользователя в базе данных.

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

$items = Auth::user()->items; 

Это так просто, чтобы получить коллекцию предметов. Это запустит 2 запроса - 1, чтобы получить пользователя и другого, чтобы получить все его предметы.

+0

Auth :: user() -> названия не очевидны. названия, относящиеся к предмету, а не к пользователю. Я предполагаю, что коллекция титров должна быть каким-то образом объединена с коллекцией предметов. Или соединение должно использоваться вместо красноречивых отношений. – user947668

+0

Я предположил, что вы хотите, чтобы это было 1 уровень, потому что это звучало так, как вы хотели в своем вопросе. Однако я отредактирую свой ответ. –

+0

Это ужасно, в идеале вы бы использовали 'first' и' pluck' соответственно. – ash

3

Просто измените функцию отношения к модели

товара:

public function title() 
{ 
    return $this->belongsTo('ItemTitle','title_id','id')->first()->title; 
} 

Вам нужно будет назвать его как $item->title(), если вы также сделать

public function getTitleAttribute(){ 
    return $this->title(); 
} 

Вы можете получить некоторые смешные вещи с все, что называется «титул», но с этим $item->title также должно работать. Думаю

+0

немного сложно, может быть, лучше использовать соединение вместо красноречивых отношений? – user947668

+0

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

+0

Это не сработает. 'get' возвращает коллекцию. Коллекция не имеет свойства title. –

Смежные вопросы