繁体   English   中英

雄辩查询中的NULL结果导致数组

[英]NULL Results in Array from Eloquent Query

有谁知道为什么这个查询会产生一些NULL结果(数组):

$events = $this->event
    ->with('delegates', 'course')
    ->where('start_date', '<=', $today)
    ->where('active', '1')
    ->where('event_status_id', '!=', '3')
    ->hasCosts()
    ->has('delegates')
    ->get()
    ->map(function($event) {
        foreach ($delegates = $event->delegates()->has('contact')->get() as $delegate) {
            $account = $delegate->contact->account;

            return [
                'company' => $account->company_name,
                'income' => $account->income($delegates),
                'profit' => $account->profit($event, $delegates),
                'event' => $account->eventDetails($event, $delegates)
            ];
        }
    })
    ->toArray();

我已进入“ foreach”循环,并转储了每个事件,客户,联系人和代表的ID,那里没有NULL结果。 我也没有收到任何错误。

当我转储$ events变量时,我收到如下输出:

array(8) {
    [0] NULL
    [1] array(4) {
        ["company"] "Razorfish"
        ["income"] 523
        ["profit"] "69.29"
        ["event"] "ITIL® Service Transition Apr 7, 2014 in London (141)"
    }
    [2] array(4) {
        ["company"] "European Central Bank - Europa ECB"
        ["income"] 1332
        ["profit"] "137.33"
        ["event"] "ITIL® Service Offerings & Agreements Apr 7, 2014 in London (142)"
    }
    [3] array(4) {
        ["company"] "Knowledge Pool - KP delegates"
        ["income"] 475
        ["profit"] "-111.75"
        ["event"] "ITIL® Foundation Apr 7, 2014 in Leeds (143)"
    }
    [4] array(4) {
        ["company"] "Plan International/ Plan UK"
        ["income"] 537
        ["profit"] "118.43"
        ["event"] "ITIL® Foundation Apr 14, 2014 in London (144)"
    }
    [5] array(4) {
        ["company"] "Cell Therapy Catapult ( part of Guy's hospital)"
        ["income"] 550
        ["profit"] "-114.75"
        ["event"] "ITIL® Service Design Apr 14, 2014 in London (145)"
    }
    [6] array(4) {
        ["company"] "European Central Bank - Europa ECB"
        ["income"] 597
        ["profit"] "69.80"
        ["event"] "BCS Specialist Certificate in Supplier Management Apr 14, 2014 in London (146)"
    }
    [7] array(4) {
        ["company"] "C Hoare & Co (hoares bank)"
        ["income"] 523
        ["profit"] "97.71"
        ["event"] "ITIL® Continual Service Improvement Apr 23, 2014 in London (148)"
    }
}

注意第一个NULL结果。 这只是输出的样本,但是实际输出中有许多类似的结果。

为简便起见,初始查询中的hasCosts()方法是一个查询范围函数:

public function scopeHasCosts($query)
{
    return $query->where('tutor_cost', '>', 0)
        ->orWhere('exam_cost', '>', 0)
        ->orWhere('material_cost', '>', 0)
        ->orWhere('venue_cost', '>', 0)
        ->orWhere('notional_cost', '>', 0)
        ->orWhere('buy_price', '>', 0);
}

在您的map()回调中,您似乎仅返回带有联系人的委托的foreach循环的第一次迭代。 如果某个事件没有任何具有联系人的代表,则不会返回任何内容-因此为null。 那是对的吗?

如文档所述:

map方法遍历集合,并将每个值传递给给定的回调。 回调程序可以自由修改并返回它,从而形成一个新的修改后的集合。

因此,您基本上只将事件集合中的每个项目替换为仅用于第一个委托的数组结果。 如果您需要每个事件的完整的委托人列表和联系方式,则最好迭代事件和委托人,构建一个单独的数组。 这样的事情可能会起作用:

$events = $this->event
    ->with('delegates', 'course')
    ->where('start_date', '<=', $today)
    ->where('active', '1')
    ->where('event_status_id', '!=', '3')
    ->hasCosts()
    ->has('delegates')
    ->get();

$results = [];

foreach ($events as $event) {
    foreach ($delegates = $events->delegates()->has('contact')->get() as $delegate) {
        $account = $delegate->contact->account;

        $results[] = [
            'company' => $account->company_name,
            'income' => $account->income($delegates),
            'profit' => $account->profit($event, $delegates),
            'event' => $account->eventDetails($event, $delegates)
        ];
    }
}

正如@benJ提到的,这部分与没有联系的代表有关。

每个代表通常都有一个联系人,但是如果不知道该联系人,他们将被链接到一个“未知”表,该表具有唯一的密钥和与之关联的帐户。 但是有时,未知数也没有账户。

我已修改查询以执行以下操作:

$events = $this->event
    ->has('delegates')
    ->with('delegates', 'course')
    ->where('start_date', '<=', $today)
    ->where('active', 1)
    ->whereNotIn('event_status_id', [3])
    ->hasCosts()
    ->get()
    ->map(function($event) use ($companies) {
        foreach ($delegates = $event->delegates()->has('contact')->get() as $delegate) {
            $account = $delegate->contact->account;

            return [
                'company' => $account->company_name,
                'account_manager' => $account->user->name(),
                'income' => $account->income($delegates),
                'profit' => $account->profit($event, $delegates),
                'event' => $account->eventDetails($event, $delegates)
            ];
        }

        foreach ($delegates = $event->delegates()->has('unknown')->get() as $delegate) {
            $account = $delegate->unknown->account;

            if ($account) {
                return [
                    'company' => $account->company_name,
                    'account_manager' => $account->user->name(),
                    'income' => $account->income($delegates),
                    'profit' => $account->profit($event, $delegates),
                    'event' => $account->eventDetails($event, $delegates)
                ];
            } else {
                $costPerDelegate = $event->costs() / count($event->delegates);
                $eventVenue = ( ! is_null($event->venue)) ? $event->venue->city : $event->venue_city;
                $eventDetails = ($event->course) ? $event->course->title : 'Unknown Course' . ' ' . $event->start_date->toFormattedDateString() . ' in ' . $eventVenue . ' (' . $event->id . ')';

                return [
                    'company' => 'Unknown',
                    'account_manager' => 'Unknown',
                    'income' => $delegate->price,
                    'profit' => number_format((float) $delegate->price - $costPerDelegate, 2, '.', ''),
                    'event' => $eventDetails
                ];
            }
        }
    })
    ->toArray();

现在,这将返回我查询的所有结果。 如果有人有更清洁的方法,我希望能听到。

现在,我必须弄清楚如何根据公司名称合并每个结果,然后添加每个公司的收入/利润,以及在事件下创建一个新数组,列出该公司的事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM