Eloquent:如何通过多态关系找到文本文件?

时间:2017-02-18 08:26:27

标签: laravel eloquent

表格结构

entity
    id - integer
    title - string
    ...    

person
    id - integer
    name - string
    ...

customers
    id - integer
    body - text
    concrete_id - integer
    concrete_type - string

型号:

class Customer extends Model
{
    ...
    public function concrete()
    {
        return $this->morphTo();
    }
    ...
}

人物和实体模型

public function customers()
{
    return $this->morphMany(Customer::class, 'concrete');
}

如何查找所有类型为' entity'以及entity.title =' abc'?

我尝试做这样的事情,

    $obj = Customer::whereHas(['concrete'  => function($query){
        $query->where('title', 'like', 'foo%');
    }])->get();

但我有一个错误:

  

Builder.php第825行中的ContextErrorException:警告:strpos()   期望参数1为字符串,给定数组

例如,我可以通过本机MySQL请求执行此操作:

SELECT *
FROM `customers`
LEFT JOIN `entities` ON (entities.id = customers.concrete_id )
WHERE `concrete_type` = "entity" AND entities.title LIKE "%foo%"

如何通过Eloquent做到这一点?

3 个答案:

答案 0 :(得分:0)

你以正确的方式工作,试试这段代码:

 Customer::whereHas('concrete', function ($query) {
           $query->where('title', 'like', 'foo%') 
        })->get();

或者您可以尝试其他方式:

Entity::has('concrete')->where('title', 'like', 'foo%')->get()

答案 1 :(得分:0)

根据你的原始MySQL重写了答案:

Customer::
        ->join('entities', function($join)
        {
            $join->on('entities.id', '=', 'customers.concrete_id')
                 ->where('entities.title', 'like', 'foo%');
        })
        ->get();

我希望这会有所帮助:)

答案 2 :(得分:0)

Laravel现在不支持'whereHas' 'MorphTo'关系。

Look laravel/framework issue 5429

而且,如果你想做计划,你can use BelongsToMorph relation

我添加到客户模型:

public function entity()
{
    return BelongsToMorph::build($this, Entity::class, 'concrete');
}

之后,请求按需工作:

    Customer::whereHas('entity', function ($query) {
      $query->where('entities.title', 'like', '%foo%');
    })->get()->toArray();