我正在尝试在laravel上使用多态关系,但是我做的每个测试在laravel假装的SQL查询上都返回null或ax异常...
仅供参考:我的laravel版本是5.8
,运行在MySQLserver 5.7
(WAMP软件包)上
根据我在laravel的文档上阅读的内容,我认为我必须在多态模型的类中使用morphTo()
,在其子表中使用morphMany()
,所以我这样编码:
App \ Models \ Company
public function accounts(){
return $this->morphMany(Accountable::class, 'accountable');
}
App \ Models \ Account \ Accountable
public function company()
{
return $this->belongsTo(Company::class);
}
public function accountable()
{
return $this->morphTo();
}
迁移:
公司
Schema::create($this->tableName, function (Blueprint $table) {
$table->bigIncrements('id');
...
})
银行帐户迁移
Schema::create('bank_accounts', function (Blueprint $table) {
$table->bigIncrements('id');
...
});
company_has_accounts迁移
Schema::create('company_has_accounts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->morphs('accountable');
...
});
问题是:每当我尝试调试BankAccount::find(1)->company
时,我都会不断得到:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'company_has_accounts.company_type' in 'where clause' (SQL: select * from `company_has_accounts` where `company_has_accounts`.`c
ompany_id` = 1 and `company_has_accounts`.`company_id` is not null and `company_has_accounts`.`company_type` = Financeiro/Models/Account/BankAccount and `company_has_accounts`.`deleted_at` is null)
,当我尝试:Company::find(1)->accounts
时,我会得到一个空的收藏集。
App \ Models \ Account \ BankAccount
public function company()
返回App \ Models \ Company对象。
App \ Models \ Account \ Company
public function accounts()
要返回混合的“ App \ Models \ Account \ BankAccount”和“ App \ Models \ Account \ CreditCard”对象的集合,这些对象均属于当前App \ Models \ Account \ Company模型,并由“ company_id”过滤“ company_has_accounts”表上的“”列。
答案 0 :(得分:0)
经过一番挣扎,我设法使它开始工作。但是由于我是Laravel的新手,所以我不知道这是否是最好的方法...
App \ Models \ Account \ Accountable
public function company(){
return $this->belongsTo(Company::class);
}
public function accountable(){
return $this->morphTo();
}
App \ Models \ Account \ Company
public function accountables(){
return $this->hasMany(Accountable::class)->with('accountable');
}
public function accounts(){
$accountables = $this->accountables();
$accounts = [];
if ($accountables->count()) {
foreach ($accountables->get() as $accountable) {
$accounts[] = $accountable->accountable;
}
}
$accounts = collect($accounts);
return $accounts;
}
App \ Models \ Account \ BankAccount
public function accountable(){
return $this->morphOne(Accountable::class, 'accountable');
}
public function company(){
$accountable = ($this->accountable())->with('company');
return $accountable->first()->company;
}