表格结构
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做到这一点?
答案 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();