如何在Laravel / Eloquent

时间:2017-12-14 17:38:17

标签: php mysql laravel eloquent polymorphic-associations

有以下型号和表格

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',
    ],
];

具有多态关系。为了避免数据透视表,所有数据都存储在一个表中,因此父呼叫不会填充parent_idextension_idextension_type。只有孩子才会有。 Asap lead只有id,其他所需信息都在其中。

流速: 首先,它使用parent创建了parent_id = null来电。如果呼叫失败,则它由parent_id创建与前一个呼叫相关联的子呼叫。另外,它添加了extension_type,因为它不止一个扩展,但不会太复杂,我们只在一种情况下运行。然后,我需要检索父级调用,其中最多3个孩子并且不会在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::...上操作以获得最终的模型而不是普通数组会更好,但我也无法弄明白。

2 个答案:

答案 0 :(得分:1)

您必须在查询中使用Raw Expressions将表名转换为sql表达式,这是一个示例:

DB::table( DB::raw('callRequests AS leads') )->...

答案 1 :(得分:0)

这最终对我有用:

$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.*');