Laravel模型的多列“pivot”表查询

时间:2015-08-20 11:31:45

标签: php mysql laravel laravel-5 eloquent

在查看laravel文档和stackoverflow两天后没有成功我不得不问这个问题

到目前为止我有4个型号,我试图一次性获取所有相关信息。

用户模型有关系:

public function transactions() {
    return $this->hasMany( 'App\Transaction' );
}

商店模型有关系::

public function transactions() {
    return $this->hasMany( 'App\Transaction' );
}

产品型号有关系::

public function transactions() {
    return $this->hasMany( 'App\Transaction' );
}

最后交易模型有关系:

public function user() {
    return $this->belongsToMany( 'App\User' );
}
public function product() {
    return $this->belongsToMany( 'App\Product' );
}
public function store() {
    return $this->belongsToMany( 'App\Store' );
}

事务表(看起来像一个数据透视表):

transactions:
    id - integer
    user_id : integer
    product_id : integer
    store_id : integer
    ....... some additional columns containing transaction specific data.

我想获取auth user

引用详细信息的所有事务

又名“$ user-> transactions”然而有了这个我只得到id没有来自相关表的数据。我确实尝试加入,但看起来很混乱,我认为有更好的方法可以在laravel中获得这些数据的良好结构

联接看起来像:

   $transactions = DB::table( 'transactions as t' )->where( 'user_id', Auth::id() )
    ->join( 'products', 'products.id', '=', 't.product_id' )
    ->join( 'stores', 'stores.id', '=', 't.store_id' )
    ->get( array( 't.id', 't.product_id', 'products.name as product_name', 't.store_id', 'stores.name as store_name' ) );

我的目标是使用尽可能少的查询获取用户对象,其中包含有关用户的所有信息,包括事务和其他详细信息,作为一个JSON响应。

2 个答案:

答案 0 :(得分:1)

您只需要将关系中所需的值附加到事务中。首先,将它们作为属性添加到Transaction模型中,如下所示:

public function getProductNameAttribute()
    {
        return $this->product?$this->product->name:"";
    }

public function getStoreNameAttribute()
    {
        return $this->store?$this->store->name:"";
    }

现在,您可以像下面这样将它们附加到事务模型中的事务中:

protected $appends = ['product_name','store_name'];

像往常一样检索事务:

Auth::user()->transactions;

或在运行时将它们附加到事务中(第一步之后):

Auth::user()->transactions()->setAppends(['product_name','store_name'])->toArray();

答案 1 :(得分:0)

如果您的目标是获取用户对象,那么您应该查询用户,而不是事务。

由于您已经定义了所有关系,您可以将查询用于Eloquent,无需手动执行。

User::whereId(Auth::user()->id)->with('transactions','transactions.product','transactions.store')->get();