Laravel Eloquent 查询错误:多态关系中未定义列

问题描述 投票:0回答:1

当WhereHas用于多态关系时,以下代码会抛出WhereHasMorph错误,并返回所有数据而不应用条件。有谁知道问题出在哪里吗?

            $personQuery = Person::query();
            $column = 'value';
            $needle = '%09133333%';
            $personQuery->orWhereHasMorph('digitalContacts', '*', function ($contactQuery) use ($column, $needle) {
                $contactQuery->where($column, 'like', '%' . $needle . '%');
            });

            $data =  $personQuery->get();

错误:

{
    "success": false,
    "payload": [],
    "errors": [
        {
            "type": "warning",
            "code": "42703",
            "message": "SQLSTATE[42703]: Undefined column: 7 ERROR:  column \"digital_contactable_type\" does not exist\nLINE 1: select distinct \"digital_contactable_type\" from \"people\"\n                        ^ (Connection: tenant, SQL: select distinct \"digital_contactable_type\" from \"people\")"
        }
    ]
}

我收到的错误消息表明“people”表中不存在“digital_contactable_type”列。但它应该在 digital_contacts 表上查找 digital_contactable_type,而不是人员!

在模型上定义关系,如下所示:

class Person extends Model
{
    public function digitalContacts()
    {
        return $this->morphMany(DigitalContact::class, 'digital_contactable', 'digital_contactable_type');
    }
    //...

}
class DigitalContact extends Model
{
    public function digitalContactable()
    {
        return $this->morphTo();
    }
        //...

}

表中相关列的定义如下:

        Schema::create('people', function (Blueprint $table) {

            $table->unsignedBigInteger('id', true);
            //...
            $table->timestamps();
        });
        Schema::create('digital_contacts', function (Blueprint $table) {
            $table->unsignedBigInteger('id', true);
            $table->unsignedBigInteger('digital_contactable_id');
            $table->string('digital_contactable_type'); // person, organization, etز
            $table->string('value');
            //...
            $table->timestamps();
        });

有什么想法吗?

php laravel eloquent eloquent-relationship
1个回答
0
投票

首先,morphMany 上的关系名称应该与 morphTo 上的关系名称匹配。 所以在我的例子中,在 person 模型上定义的 digitalContacts 关系应该如下所示:

public function digitalContacts()
{
    return $this->morphMany(DigitalContact::class, 'digitalContactable', 'digital_contactable_type', 'digital_contactable_id');
}

而且显然,不存在 orWhereHasMorph。您可以简单地使用 orWhereHas。

© www.soinside.com 2019 - 2024. All rights reserved.