我有两个表。期刊和卷。日记表具有独特的行,卷表具有基于日记表ID的行,名称为journal_id(可能是多个)。
期刊表是:
id | journal_name
1 | journal1
2 | journal2
卷表是:
id | journal_id | volume_name
1 | 1 | volume1
2 | 1 | volume2
3 | 1 | volume3
4 | 2 | volume4
5 | 2 | volume5
现在,我需要从日记表和的行连接到基于journal_id 的最后一行。
结果应为:
id | journal_name | journal_id | volume_name
1 | journal1 | 1 | volume3
2 | journal2 | 2 | volume5
并非卷表中的所有行。(仅需要每组journal_id的最后一行)。
MySQL查询所需的结果是:
SELECT J.journal_name,V.id,V.journal_id FROM journals AS J
INNER JOIN (SELECT *
FROM volumes
WHERE id IN (
SELECT MAX(id)
FROM volumes
GROUP BY journal_id
)) AS V ON J.id = V.journal_id
现在我在Laravel中的尝试是:
控制器是:
public function index()
{
$volumes = volume::with('volumes')->orderBy('id','desc')->limit(1)->get();
return view('welcome',compact('volumes'));
}
音量模型是:
function volumes()
{
return $this->belongsTo(journal::class, 'journal_id');
}
,但它从整个音量表中仅提供一行。我需要每组中的最后一行。
您可以使用HasOne
关系:
class Journal extends Model
{
public function latestVolume()
{
return $this->hasOne(Volume::class)->orderByDesc('id');
}
}
$journals = Journal::with('latestVolume')->get();
请注意,这仍然会从数据库中获取所有卷。然后丢弃"旧"。
如果您想通过真正提高性能
包装允许您将limit()
应用于关系:
class Journal extends Model
{
use StaudenmeirEloquentEagerLimitHasEagerLimit;
public function latestVolume()
{
return $this->hasOne(Volume::class)->orderByDesc('id')->limit(1);
}
}
定义模型的正确方法是:
期刊模型
function volumes()
{
return $this->belongsTo(Volume::class);
}
音量模型
function journals()
{
return $this->hasMany(Journal::class);
}
现在$journal->volumes
应该返回所有属于该期刊的卷。