在Laravel Eloquent中使用联接获取多个记录

时间:2014-09-30 09:13:02

标签: laravel laravel-4 eloquent

我非常擅长使用Laravel,因此对Eloquent来说。我对Eloquent的桌子关系感到困惑。

现在我了解了如何实现简单连接,例如Laravel 4.2文档中的示例,该文档针对一对多关系,comment属于一个post但是post可以有多个comments。他们使用这种语法从一篇文章中获取评论:

Post::find(1)->comments;

在MySQL中,可能就像:

SELECT * FROM comments
JOIN posts ON posts.id=comments.post_id
WHERE posts.id=1

如果我试图获得的结果不仅仅是一行,那该怎么办?

SELECT * FROM comments
JOIN posts ON posts.id=comments.post_id

我知道根据我上面给出的例子它没有多大意义。但是我如何在Eloquent中做到这一点?

要提供更多详细信息,我实际上要做的是显示我的两个表assetsasset_classifications的联接结果。 asset属于一个asset_classificationasset_classificationassetsassets

我试图显示包含asset_classifications的{​​{1}}的表格数据。在MySQL中,它是这样的:

SELECT * FROM assets
JOIN asset_classifications ON asset_classifications.id=assets.classification_id

我如何在Eloquent中执行它?

1 个答案:

答案 0 :(得分:5)

我猜你对SQL有点过于依赖:)尝试在连接之外思考并在模型和melattionship中查询更多,因为Laravel会为你处理所有的抽象。

所以你有一个资产模型:

class Asset extends Eloquent
{
    public function classification()
    {
        return $this->belongsTo('AssetClassification');
    }
}

...和AssetClassification mdoel:

class AssetClassification extends Eloquent
{
    public function assets()
    {
        return $this->hasMany('Asset');
    }
}

现在他们已经联系在一起,你可以随心所欲。如果要输出所有资产及其分类,没问题:

$assets = Asset::all();

foreach($assets as $asset)
{
    echo "{$asset->name}" is classified as {$asset->classification}";
}

或者相反:

$classifications = AssetClassification::all();

foreach($classifications as $classification)
{
    echo "{$classification->name} has the following assets:";

    foreach($classification->assets as $asset)
    { ... }
}

作为一个数组,这看起来像

[0] => [
       'id' => 1
       'name' => 'asset_name_1',
       ],
[1] => [
       'id' => 2
       'name' => 'asset_name_2',
       ],

你明白了。问题是,您对每次迭代执行单独的查询。这就是为什么你应该使用eager loading来加载所有资产以及它们的依赖关系:

$assets = Asset::with('classification')->get();

现在你有一个像这样的数组:

[0] => [
       'id' => 1
       'name' => 'asset_name_1',
       'classification' => AssetClassiciation-Object
       ],
[1] => [
       'id' => 2
       'name' => 'asset_name_2',
       'classification' => AssetClassiciation-Object
       ],

现在,您可以循环访问资产及其分类,而无需进行任何进一步的SQL查询。