如何在拉拉维尔(Laravel)中获得从一个关系到许多关系的单一记录



我在模型中有一对一对多关系,它可以按照我的需求工作,但是有时候我只需要返回一个记录(而不是作为集合数量)。这是我的控制器

$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模型

class Sesi extends Model
{
    protected $table = 'sesi';
    public $timestamps = false;
    public function jadwal()
    {
        return $this->hasMany('SIAStarJadwal','id_sesi');
    }
}

JADWAL模型

class Jadwal extends Model
{
    protected $table= 'jadwal';
    public $timestamps = false;
    public function mapelLokal()
    {
        return $this->belongsTo('SIAStarMapelLokalGuru','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('SIAStarMataPelajaran','mapel_id');
    }
    public function guru()
    {
        return $this->belongsTo('SIAStarGuru','guru_id');
    }
    public function formNilai()
    {
        return $this->hasMany('SIAStarFormNilai','id_mapel_lokal');
    }
    public function lokal()
    {
        return $this->belongsTo('SIAStarLokal','id_lokal');
    }
    public function postMateri()
    {
        return $this->hasMany('SIAStarPostKelasOnline','id_mapel_lokal');
    }
}

,控制器的结果就像这样

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

当您SE时,Jadwal的关系返回了一个收藏,但是我想要的只是单个记录,因为它只有一个记录。如何查询嵌套关系,因此Jadwal关系仅返回一个数据?

当您调用jadwal关系时(例如$sesi->jadwal),如果您只想获得第一个记录,只需致电first()$sesi->jadwal->first()

如果您始终只需要一个jadwal关系,请考虑使用hasOne()而不是hasMany()

有很多方法可以在laravel中执行此任务,例如

  1. 可以将take(1)与Builder一起返回1个记录。
  2. 可以使用 first()获取第一记录。
  3. 可以在关系中使用latest() or oldest() or limit(1)

希望这会有所帮助。随意问。

每当您需要从表中进行单个记录时,建议使用雄辩的 value()方法。

您可能想看看。这是参考

first()latest()oldest()等方法仍然会返回完整行。

另外,您可以使用select('column_name_of_the_record')->first(),但我不知道为什么如果您有value()

我希望它能有所帮助

最新更新