无法使laravel的多态关系起作用

时间:2019-08-23 17:34:54

标签: php laravel laravel-5 laravel-5.8

我正在尝试在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”表上的“”列。

1 个答案:

答案 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;
}
相关问题