41

laravel でモデルを熱心に読み込もうとしていますが、特定の列のみを返します。熱心にロードされたテーブル全体が表示されるのは望ましくありません。

public function car()
{
    return $this->hasOne('Car', 'id')->get(['emailid','name']);
}

次のエラーが表示されます。

log.ERROR: 例外 'Symfony\Component\Debug\Exception\FatalErrorException' とメッセージ 'Call to undefined method Illuminate\Database\Eloquent\Collection::getAndResetWheres()' が発生する

4

9 に答える 9

68

select()次の方法を利用します。

public function car() {
    return $this->hasOne('Car', 'id')->select(['owner_id', 'emailid', 'name']);
}

注:両方のテーブルに一致する外部キーに割り当てられた列を忘れずに追加してください。たとえば、私の例では、 aOwnerが であると仮定しましたCar。つまり、外部キーに割り当てられた列は のようなものになるので、選択した列のリストowners.id = cars.owner_idに追加する必要がありました。owner_id

于 2013-06-07T23:57:33.203 に答える
23

また、モデル内の特定の列の取得と関係メソッド自体を指定する必要はありません...必要なときにいつでもそれを行うことができます...このように:

$owners = Owner::
          with([
              'car' => function($q)
               {
                    $q->select('id', 'owner_id', 'emailid', 'name');
               },
               'bike' => function($q)
               {
                    $q->select('id', 'owner_id', 'emailid', 'name');
               }
          ])->
          get();

このようにして、必要に応じて、関連するモデルのすべての列を取得することもできます。

于 2015-12-01T11:29:00.670 に答える
18

コントローラーでは、次のようなことを行う必要があります

App\Car::with('owner:id,name,email')->get();

以下のように定義された2つのモデルがあるとします

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Car extends Model
{
    protected $table = 'car';

    public function owner()
    {
        return $this->belongsTo('App\Owner', 'owner_id');
    }
}

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class Owner extends Model
{
    protected $table = 'owner';

    public function car()
    {
        return $this->hasMany('App\Car', 'owner_id');
    }
}

次のような2つのテーブルがあります。

owners: id | name | email | phone | other_columns...

cars: id | owner_id | make | color | other_columns...

クレジットはドキュメントに移動します: eloquent-relationships#eager-loading特定の列の Eager Loadingまでスクロールします。

于 2017-12-20T08:36:35.780 に答える
9

あなたができる最も簡単な方法は、ドキュメントを読んで、次のことを実行して、余分なコード行やクロージャーなしで特定の列のみを取得することです。手順に従って、

public function car(){
    return $this->hasOne('Car', 'id');
}

次に、リレーションを熱心にロードするときに、選択した列のみを選択します

$owner = $this->owner
->where('id', 23)
->with('car:id,owner_id,emailid,name')   //no space after comma(, ) and id has to be selected otherwise it will give null

これが機能することを願っています。素晴らしい一日をお過ごしください。

于 2019-07-26T10:37:08.413 に答える