如何计算查询结果并将其作为 JSON 格式的数组发送?

How to `count` a query result and send it as an array in JSON format?

详情

我要

这是我试过的

这是我的代码

public function index()
{
    $distributors = [];
    $count = 0;

    foreach( 

        // Specific Distributors 
        Distributor::where('type','!=','OEM')->where('type','!=','MKP')
        ->get() as $distributor){

        // Variables
        $count = $count + 1; 
        $user = $distributor->user()->first();

        $distributors[$distributor->id] = [

        'user' => $user->toArray(),
        'distributor' => $distributor->toArray(),
        'hq_country' => $distributor->country()->first(),
        'address' => $distributor->addresses()
        ->where('type','=','Hq')->first()->toArray(),

        'count' => $count->toArray()

        ];
    }

    return Response::json($distributors);
}

结果

代码不会运行,因为我的 $distributor 数组不存在...

它会运行,如果我关闭 'count' => $count->toArray()

已更新

对不起,我可能是错的。

我不是 laravel 专家。

但是这个片段是关于什么的?

这个索引函数是模型的一部分?

@evoque2015 正在尝试将一些自定义数组放入 $distributors[$distributor->id] 中?

如果这是目标,您能否使用您认为应该有效的 'count' 的任何简单值进行任何测试?

我的猜测是:'count' 索引不接受 table 用于您的 Distributor::where 函数

(如果它是 acceptable - 显示为 'count' 的值,即使 return 错误 result/data 也不会破坏您的代码)。

所以我会尝试将此参数的名称更改为 'my_custom_count', 应该在 Distributor 模型声明的某处声明吗?

找到这个: Add a custom attribute to a Laravel / Eloquent model on load?

看来要证明我的猜测了

因此我们需要更改模型 class,例如:

class Distributor extends Eloquent {

    protected $table = 'distributors';//or any you have already

    public function toArray()
    {
        $array = parent::toArray();
        $array['count'] = $this->count;
        return $array;
    }

.....
}

并且可能会在模型中进行更多更改,或者只是将 'count' 列添加到 table :-)

将这种计数添加到结果中确实没有多大意义。只发送结果并让客户端进行计数要简单得多。因为关于您实际拥有多少经销商的信息就在您的经销商列表中。只是它的长度。

这是一个 javascript 的例子(和 $.ajax 虽然这并不重要)

$.ajax({
    url: 'get/distributors',
    method: 'GET'
}).done(function(data){
    var count = data.length;
});

型号:

class Distributor extends Eloquent {
    public function country()
    {
        return $this->hasOne('Country');
    }

    public function addresses()
    {
        return $this->hasMany('Address');
    }

    public function hqAddress()
    {
        return $this->addresses()->where('type', 'Hq')->first();
    }

    public function user()
    {
        return $this->hasOne('User');
    }
}

控制器:

$distributors = Distributor::whereNotIn('type', ['OEM', 'MKP'])
    ->with('country', 'user')->get();

$count = 0;
$distributors->each(function(Distributor $distributor) use(&$count) {
    $distributor->count = $count;
    $count++;
});

return Response::json($distributors);