如何在Laravel中从一对多关系中获取单个记录

时间:2019-03-05 07:09:07

标签: laravel laravel-5 eloquent

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

$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('SIAStar\Jadwal','id_sesi');
    }
}

美洲虎模型

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 :(得分:0)

调用jadwal关系(例如$sesi->jadwal)时,如果只想获取第一条记录,只需调用first()$sesi->jadwal->first()

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

每当需要从表中获取一条记录时,建议您从雄辩地使用value()方法。

您可能想查一下。这是reference

first()latest()oldest()等方法仍将返回整行。

或者,您可以使用select('column_name_of_the_record')->first(),但我不明白为什么无论如何您都会得到value()

我希望对您有帮助