如何仅查找第二个表的最后一行及其第一个表行

问题描述 投票:0回答:2

我有两张桌子。期刊和卷。 Journal Table具有唯一的行,而volume表具有基于journal table id的行,name是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');
 }

但它只从整个卷表中提供一行。我需要卷表中每组journal_id的最后一行。

laravel laravel-5 eloquent
2个回答
2
投票

你可以使用HasOne关系:

class Journal extends Model
{
    public function latestVolume()
    {
        return $this->hasOne(Volume::class)->orderByDesc('id');
    }
}

$journals = Journal::with('latestVolume')->get();

请注意,这仍将从数据库中获取所有卷。然后丢弃“旧的”。

如果你想通过真正只获取最新的卷来提高性能,你可以使用我创建的这个包:https://github.com/staudenmeir/eloquent-eager-limit

该软件包允许您将limit()应用于这种关系:

class Journal extends Model
{
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;

    public function latestVolume()
    {
        return $this->hasOne(Volume::class)->orderByDesc('id')->limit(1);
    }
}

0
投票

定义模型的正确方法是:

期刊模型

function volumes()
{
    return $this->belongsTo(Volume::class);
}

卷模型

function journals()
{
    return $this->hasMany(Journal::class);
}

现在$journal->volumes应该返回属于该期刊的所有卷。

© www.soinside.com 2019 - 2024. All rights reserved.