Как получить одну запись от одного ко многим отношениям в Laravel - PullRequest
0 голосов
/ 05 марта 2019

У меня есть отношение один ко многим в моих моделях, и оно работает так, как я хочу, но иногда мне нужна только одна запись, которую нужно вернуть (не как массив коллекции).Вот мой контроллер

$sesi = Sesi::with('jadwal.mapelLokal.guru','jadwal.mapelLokal.matapelajaran')->whereHas('jadwal',function($jadwal) use ($r) {
            $jadwal->whereHas('mapelLokal',function($mapel) use($r) {
                $mapel->where('id_lokal',$r->lokal);
            });
        })->get();

Sesi Model

class Sesi extends Model
{
    protected $table = 'sesi';
    public $timestamps = false;

    public function jadwal()
    {
        return $this->hasMany('SIAStar\Jadwal','id_sesi');
    }
}

jadwal модель

class Jadwal extends Model
{
    protected $table= 'jadwal';
    public $timestamps = false;

    public function mapelLokal()
    {
        return $this->belongsTo('SIAStar\MapelLokalGuru','id_mapel_lokal');
    }
}

и MapelLokalGuru

class MapelLokalGuru extends Model
{
    protected $table = 'mapel_lokal_guru';
    protected $fillable = ['id_lokal','mapel_id','guru_id'];
    public $timestamps=false;

    public function mataPelajaran()
    {
        return $this->belongsTo('SIAStar\MataPelajaran','mapel_id');
    }
    public function guru()
    {
        return $this->belongsTo('SIAStar\Guru','guru_id');
    }
    public function formNilai()
    {
        return $this->hasMany('SIAStar\FormNilai','id_mapel_lokal');
    }
    public function lokal()
    {
        return $this->belongsTo('SIAStar\Lokal','id_lokal');
    }
    public function postMateri()
    {
        return $this->hasMany('SIAStar\PostKelasOnline','id_mapel_lokal');
    }
}

и результатКонтроллер выглядит так:

    Collection {#454 ▼
      #items: array:2 [▼
        0 => Sesi {#452 ▼
          #table: "sesi"
//...
          #relations: array:1 [▼
            "jadwal" => Collection {#468 ▼
              #items: array:1 [▶]
            }
          ]
        }
      ]
    }

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

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Есть много способов выполнить эту задачу в laravel, например,

  1. Можно использовать take(1) со сборщиком для возврата только 1 записи.
  2. Можно использовать first() для получения первойзапись.
  3. Может использовать latest() or oldest() or limit(1) в отношениях.

Надеюсь, это поможет.Не стесняйтесь спрашивать.

0 голосов
/ 05 марта 2019

Всякий раз, когда вам нужна отдельная запись из таблицы, рекомендуется использовать метод value() из eloquent.

Возможно, вы захотите посмотреть это.Вот ссылка

Такие методы, как first(), latest(), oldest() и т. Д., По-прежнему будут возвращать полную строку.

В качестве альтернативы, вы можете использовать select('column_name_of_the_record')->first() но я не понимаю, зачем вам это использовать, если вы все равно получили value().

Надеюсь, это поможет

0 голосов
/ 05 марта 2019

Когда вы вызываете отношение jadwal, например $sesi->jadwal, если вы хотите получить только первую запись, просто позвоните first(): $sesi->jadwal->first().

Если вы всегда требуется только одно jadwal отношение, рассмотрите возможность использования hasOne() вместо hasMany().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...