Laravel 5.6 急切加载嵌套的子关系
Laravel 5.6 eager load nested childrelations
我在获取从 Card 对象到 User 对象的子关系时遇到了问题。关系如下:
'User' -> hasOne 'Company'
'Company' -> hasMany 'Card'
所以反过来就是:
'Card' -> belongsTo 'Company'
'Company' -> belongsTo 'User'
我的卡片模型有这个:
public function company()
{
return $this->belongsTo('App\Company');
}
我的公司模型有这个:
public function user()
{
return $this->belongsTo('App\User');
}
public function cards()
{
return $this->hasMany('App\Card');
}
我的用户模型有这个:
public function company()
{
return $this->hasOne('App\Company');
}
我想做的是:在用户模型中,我想立即加载该用户的所有卡片。所以我的代码如下所示:
$cards = Card::with('company.user')->get();
但它不断地向我返回数据库中的所有卡记录,而不是来自已登录用户本身的记录。肯定有
是一个 userID,因为当我在 User 模型中转储 $this->id 时,我得到了 ID“1”。在数据库中,我已经配置了所有外键,所以这不会是我假设的问题。
Table'cards'有一个指向'company_id'的外键,而table'companies'有一个指向'user_id'的外键,它们是全部由迁移脚本设置,如下所示:
Schema::create('cards', function (Blueprint $table) {
$table->increments('id');
$table->integer('amount');
$table->string('status');
$table->unsignedInteger('company_id');
$table->timestamp('expires_at')->nullable();
$table->boolean('is_debit_allowed')->default(1);
$table->string('cancelled_by')->nullable();
$table->timestamp('cancelled_at')->nullable();
$table->timestamps();
$table->foreign('company_id')->references('id')->on('companies');
});
我做错了什么吗?
在User
模型中,可以将其添加到$with
数组中:
// this will eager load the company and cards for every user query, so beware!
protected $with = ['company.cards'];
或者创建一个新函数cards
:
public function cards()
{
return $this->company->cards;
}
$cards = $user->cards();
// use the auth helper to get logged in user's cards
$cards = auth()->user()->cards();
这应该适用于通过 Card
访问:
$cards = Card::whereHas('company.user', function ($query) {
$query->whereKey(auth()->id());
})->get();
我在获取从 Card 对象到 User 对象的子关系时遇到了问题。关系如下:
'User' -> hasOne 'Company'
'Company' -> hasMany 'Card'
所以反过来就是:
'Card' -> belongsTo 'Company'
'Company' -> belongsTo 'User'
我的卡片模型有这个:
public function company()
{
return $this->belongsTo('App\Company');
}
我的公司模型有这个:
public function user()
{
return $this->belongsTo('App\User');
}
public function cards()
{
return $this->hasMany('App\Card');
}
我的用户模型有这个:
public function company()
{
return $this->hasOne('App\Company');
}
我想做的是:在用户模型中,我想立即加载该用户的所有卡片。所以我的代码如下所示:
$cards = Card::with('company.user')->get();
但它不断地向我返回数据库中的所有卡记录,而不是来自已登录用户本身的记录。肯定有 是一个 userID,因为当我在 User 模型中转储 $this->id 时,我得到了 ID“1”。在数据库中,我已经配置了所有外键,所以这不会是我假设的问题。
Table'cards'有一个指向'company_id'的外键,而table'companies'有一个指向'user_id'的外键,它们是全部由迁移脚本设置,如下所示:
Schema::create('cards', function (Blueprint $table) {
$table->increments('id');
$table->integer('amount');
$table->string('status');
$table->unsignedInteger('company_id');
$table->timestamp('expires_at')->nullable();
$table->boolean('is_debit_allowed')->default(1);
$table->string('cancelled_by')->nullable();
$table->timestamp('cancelled_at')->nullable();
$table->timestamps();
$table->foreign('company_id')->references('id')->on('companies');
});
我做错了什么吗?
在User
模型中,可以将其添加到$with
数组中:
// this will eager load the company and cards for every user query, so beware!
protected $with = ['company.cards'];
或者创建一个新函数cards
:
public function cards()
{
return $this->company->cards;
}
$cards = $user->cards();
// use the auth helper to get logged in user's cards
$cards = auth()->user()->cards();
这应该适用于通过 Card
访问:
$cards = Card::whereHas('company.user', function ($query) {
$query->whereKey(auth()->id());
})->get();