Laravel和Eloquent:在检索相关项时指定列

时间:2014-02-12 19:19:52

标签: select laravel relationship eloquent

这是以下帖子: Laravel 4 and Eloquent: retrieving all records and all related records

给出的解决方案很有用:

$artists = Artist::with('instruments')->get();
return \View::make('artists')->withArtists($artists);

它也适用于:

$artists = Artist::get();

现在我正在尝试为两个表指定要返回的确切列。我已尝试在上面的语句和我的类中使用select(),如下所示:

ArtistController.php

$artists = Artist::select('firstname', 'lastname', 'instruments.name')->get();

或:

$artists = Artist::with(array('instruments' => function($query) {
    $query->select('name');
}))->get();

(如建议的here虽然这不会引发错误,但它也不会将列限制为仅指定的列)

Artist.php

return $this->belongsToMany('App\Models\Instrument')->select(['name']);

我如何从firstname表和lastname列中artistsname 表?

2 个答案:

答案 0 :(得分:3)

不确定我在想什么。我觉得这么长时间的工作让我眼花缭乱。

无论如何,我更多地研究了这个并搜索了答案,最后在GitHub上发布了一个问题。

从Laravel v4.1开始,底线是

https://github.com/laravel/laravel/issues/2679

<击> 这解决了它:

<强> Artists.php

public function instruments() {
    return $this->hasMany('App\Models\Instrument', 'id');
}

请注意,我将其更改为hasMany belongsToMany,这对我来说更有意义,因为音乐家(或Artist)会有很多Instrument个玩家并且Instrument可能属于许多Artist(我在上面提到的上述问题中也提到过)。我还必须在我的模型中指定'id'列,告诉ORM instrument.id匹配artist_instrument.id。这部分让我感到困惑,因为我认为hasMany的顺序是foreign_keyprimary_key,但也许我正在考虑它倒退。如果有人可以解释一下,我会很感激。

无论如何,解决方案的第二部分......

ArtistsController.php 中,我这样做了:

$artists = Artist::with(array(
    'instruments' => function($q) {
        $q->select('instruments.id', 'name');
    })
)->get(array('id', 'firstname', 'lastname'));

这给了我我想要的东西,这是一个艺术家集合,只包含firstname表格中的lastnameartists列以及{他们从name播放的每个乐器的{1}}列。

答案 1 :(得分:2)

$artists = Artist::with(array('instruments' => function ($query) {
    $query->select('id', 'name');
}))->get('id', 'firstname', 'lastname');