Surzhikov
@Surzhikov
Разработчик

Как правильно выбрать определенные столбцы в Relations ORM?

Пытаюсь в Laravel5 сделать правильную связь hasMany c выбором нескольких столбцов из дочерней таблицы.
Есть модель Event (мероприятие) к нему привязан один или больше Diploma (Диплом).
Для Мероприятия из таблицы Diploma мне нужно выбирать только некоторые поля (id и name), поскольку там есть очень объемные поля, тянуть которые каждый раз не нужно.

Таблица events:
id
name
date

Таблица diplomas:
id
event_id
name
setupdata


Делаю так:
Модель
<?php
namespace osportid\Models;
use Illuminate\Database\Eloquent\Model;
class Event extends Model
{
	protected $table = 'events';
	/**
	 *	Получить дипломы для Мероприятий
	 */
	public function event_diplomas()
	{
		return($this->hasMany('osportid\Models\Diploma', 'event_id', 'id'));
	}
}


Контроллер:
В таком вариант все работает, но выводит сразу все поля из таблицы diplomas
.....
	/*
		Show Event View by event Identify
	*/
	public function getEvent($id)
	{	
		$event = Event::with(['event_diplomas'])->where("id", '=', $id)->firstOrFail();
		dd($event);
	}
.....


Так не работает (вывод event_diplomas - пусто)
<?php
namespace osportid\Models;
use Illuminate\Database\Eloquent\Model;
class Event extends Model
{
	protected $table = 'events';
	/**
	 *	Получить дипломы для Мероприятий
	 */
	public function event_diplomas()
	{
		return($this->hasMany('osportid\Models\Diploma', 'event_id', 'id')->select('id','name')));
	}
}


Так тоже не работает (вывод event_diplomas опять пусто)
.....
	/*
		Show Event View by event Identify
	*/
	public function getEvent($id)
	{	
		$event = Event::with([
			'event_diplomas'=>function($query)
			{
				$query->select('id', 'name');
			}
		])->where("id", '=', $id)->firstOrFail();
		dd($event);
	}
.....


Я перечитал тучу иностранных форумов и Стэковерфлоу, и нашел эти решения, но как понял из комментариев - у кого-то они работают, у кого-то не работают.
  • Вопрос задан
  • 689 просмотров
Решения вопроса 1
Surzhikov
@Surzhikov Автор вопроса
Разработчик
Нашел на просторах Laracasts;
https://laracasts.com/discuss/channels/eloquent/el...
9955fc9fd4d646b0bf9b6d8240ff5149.png

Идея в том, что в выборке обязательно должны присутствовать foreign index и primary index.
Итого, сделал так и все заработало.
.....
  /*
    Show Event View by event Identify
  */
  public function getEvent($id)
  {	
    $event = Event::with([
      'event_diplomas'=>function($query)
      {
        $query->select('id', 'event_id', 'name');
      }
    ])->where("id", '=', $id)->firstOrFail();
    dd($event);
  }
.....
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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