【问题标题】:How to get single record from one to many relationship in laravel如何在laravel中从一对多关系中获取单条记录
【发布时间】:2019-07-26 14:09:54
【问题描述】:

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

$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();

塞西模型

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关系只返回一个数据?

【问题讨论】:

    标签: laravel laravel-5 eloquent


    【解决方案1】:

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

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

    【讨论】:

    • 在某些情况下我还需要将 jadwal 作为集合返回,但在特殊情况下我只需要一条记录,这可能吗?
    【解决方案2】:

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

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

    希望这会有所帮助。欢迎随时提问。

    【讨论】:

    • 我知道我们可以使用 first(),但是我们可以在关系中使用它吗?
    • 您希望在逻辑或模型中指定关系。顺便说一句,您可以在两个地方使用。
    • 在逻辑上,我需要完美的查询构建器
    【解决方案3】:

    当您需要表中的单个记录时,建议使用 eloquent 中的 value() 方法。

    你可能想查一下。这是reference

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

    或者,你可以使用select('column_name_of_the_record')->first(),但我不明白如果你得到value(),你为什么还要使用它。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      相关资源
      最近更新 更多