如何在 Laravel/Eloquent 中为多态 table 添加别名
How to alias polymorphic table in Laravel/Eloquent
有以下型号和table
CallRequest (parent)
'id',
'parent_id',
'phone_number',
'extension_id',
'extension_type',
public $morphTo = [
'extension' => [],
];
AsapLead (children)
'id'
public $morphOne = [
'call_request' => [
CallRequest::class,
'name' => 'extension',
],
];
里面有多态关系。为了避免pivot table,所有数据都存储在一个table中,因此parent调用不会有parent_id
、extension_id
和extension_type
填满。只有 children 会有这些。 Asap lead 只有 id
,其余需要的信息在它的 parent。
流量:
首先,它创建了 parent
调用 parent_id = null
。如果调用失败,则会创建 child 调用,通过 parent_id
与前一个调用连接。另外它添加了 extension_type
,因为有多个扩展名,但为了不复杂,我们在这种情况下只对一个进行操作。然后我需要检索 parent 调用 ,它有 maximum 3 children 并且创建时间不早于 7 天背部。查询如下所示:
$callRequestTable = CallRequest::table();
$leadTable = CallRequest::table() . " as lead";
DB::table($leadTable)
->rightjoin($callRequestTable, 'lead.id', '=', $callRequestTable . '.parent_id')
->where($callRequestTable . '.extension_type', '=', AsapLead::class)
->where($callRequestTable . '.created_at', '>', Carbon::now()->subDays(7))
->groupBy('lead.id')
->having(DB::raw('count(*)'), '<', 3)
->select('lead.*')
->get();
但不幸的是它不起作用。最好在 CallRequest::...
上操作,以便最终获得这些模型而不是普通数组,但我也无法弄清楚。
您必须在查询中使用 Raw Expressions 将 table 名称转换为 sql 表达式,这是一个示例:
DB::table( DB::raw('callRequests AS leads') )->...
这终于对我有用了:
$callRequestTable = CallRequest::table();
$leadTable = CallRequest::table() . " as lead";
return CallRequest::from(DB::raw($leadTable))
->leftJoin($callRequestTable, 'lead.id', '=', $callRequestTable . '.parent_id')
->where('lead.extension_type', '=', AsapLead::class)
->where('lead.created_at', '>', Carbon::now()->subDays(7))
->groupBy('lead.id')
->having(DB::raw('count(*)'), '<', 3)
->select('lead.*');
有以下型号和table
CallRequest (parent)
'id',
'parent_id',
'phone_number',
'extension_id',
'extension_type',
public $morphTo = [
'extension' => [],
];
AsapLead (children)
'id'
public $morphOne = [
'call_request' => [
CallRequest::class,
'name' => 'extension',
],
];
里面有多态关系。为了避免pivot table,所有数据都存储在一个table中,因此parent调用不会有parent_id
、extension_id
和extension_type
填满。只有 children 会有这些。 Asap lead 只有 id
,其余需要的信息在它的 parent。
流量:
首先,它创建了 parent
调用 parent_id = null
。如果调用失败,则会创建 child 调用,通过 parent_id
与前一个调用连接。另外它添加了 extension_type
,因为有多个扩展名,但为了不复杂,我们在这种情况下只对一个进行操作。然后我需要检索 parent 调用 ,它有 maximum 3 children 并且创建时间不早于 7 天背部。查询如下所示:
$callRequestTable = CallRequest::table();
$leadTable = CallRequest::table() . " as lead";
DB::table($leadTable)
->rightjoin($callRequestTable, 'lead.id', '=', $callRequestTable . '.parent_id')
->where($callRequestTable . '.extension_type', '=', AsapLead::class)
->where($callRequestTable . '.created_at', '>', Carbon::now()->subDays(7))
->groupBy('lead.id')
->having(DB::raw('count(*)'), '<', 3)
->select('lead.*')
->get();
但不幸的是它不起作用。最好在 CallRequest::...
上操作,以便最终获得这些模型而不是普通数组,但我也无法弄清楚。
您必须在查询中使用 Raw Expressions 将 table 名称转换为 sql 表达式,这是一个示例:
DB::table( DB::raw('callRequests AS leads') )->...
这终于对我有用了:
$callRequestTable = CallRequest::table();
$leadTable = CallRequest::table() . " as lead";
return CallRequest::from(DB::raw($leadTable))
->leftJoin($callRequestTable, 'lead.id', '=', $callRequestTable . '.parent_id')
->where('lead.extension_type', '=', AsapLead::class)
->where('lead.created_at', '>', Carbon::now()->subDays(7))
->groupBy('lead.id')
->having(DB::raw('count(*)'), '<', 3)
->select('lead.*');