在查看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响应。
答案 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();