Как посчитать и суммировать внутреннюю реляционную модель в Laravel - PullRequest
0 голосов
/ 15 сентября 2018

Я создаю небольшое приложение в Laravel, где я застрял с суммой внутренних реляционных данных,

У меня есть модель Company, которая has Many, отношение associatedProjects и associatedProjects * 1007.* отношение project и project hasOne technicalDescription.

Компания Модель:

class Company extends Model {

    public function roles()
    {
        return $this->belongsToMany('Noetic\Plugins\Conxn\Models\Variables\Company\Role', 'company_role_relation', 'company_id', 'role_id')->withTimestamps();
    }

    public function specialisations()
    {
        return $this->belongsToMany('Noetic\Plugins\Conxn\Models\Variables\Company\Role', 'company_specialisation_relation', 'company_id', 'specialisation_id')->withTimestamps();
    }

    public function associatedProjects()
    {
        return $this->hasMany('Noetic\Plugins\Conxn\Models\Project\AssociateCompany','company_id','id');
    }

}

AssociateCompany Модель:

class AssociateCompany extends Model {

    protected $table = 'project_associate_company';

    protected $fillable = [
        'project_id', 'company_role_id', 'company_specialisation_id', 'company_id', 'link', 'file_name'
    ];

    public function project()
    {
        return $this->belongsTo('Noetic\Plugins\Conxn\Models\Project','project_id','id');
    }

    public function company()
    {
        return $this->belongsTo('Noetic\Plugins\Conxn\Models\Company','company_id','id');
    }

    public function companyRole()
    {
        return $this->belongsTo('Noetic\Plugins\Conxn\Models\Variables\Company\Role',
            'company_role_id','id');
    }

    public function specialisation()
    {
        return $this->belongsTo('Noetic\Plugins\Conxn\Models\Variables\Company\Role',
            'company_specialisation_id','id');
    }
}

Проект Модель

class Project extends Model {

    protected $fillable = [
        'user_id','koshy_id', 'name', 'slug', 'owner_spv', 'spv_link', 'latitude', 'longitude',
        'landmark', 'city', 'district', 'state', 'pin_code', 'region_id', 'country', 'building_use',
        'sector', 'conxn_id', 'parent_project_id', 'website', 'project_logo', 'tracked', 'verified',
        'code_link', 'status', 'active', 'premium','area'
    ];

    public function technicalDescription()
    {
        return $this->hasOne('Noetic\Plugins\Conxn\Models\Project\TechnicalDescription','project_id','id');
    }

    public function associateCompany()
    {
        return $this->hasMany('Noetic\Plugins\Conxn\Models\Project\AssociateCompany','project_id','id');

    }

}

Теперь этот technicalDescription имеет поля construction_cost, теперь я хочу сначала подсчитать общее число associatedProject и получитьсумма всех project construction_cost, которая находится в technicalDescription, кое-что, что я сделал этот код:

$company = Company:: where( 'status', 'saved')
    ->withCount( 'associatedProjects' )
    ->with('associatedProjects.project.technicalDescription')
    ->get()
    ->transform(function ($value)   {
        $value['project_value'] = $value['associatedProjects']->flatten(2)
            ->pluck('project.technicalDescription')->sum('construction_cost');
        return  $value;
    })
    ->sortByDesc('project_value')
    ->forpage( $request->page , 10 );

$next = $request->page+1 ;
$previous =$request->page-1 ? abs($request->page-1):1 ;

Я не могу использовать paginate здесь, так как коллекция Laravel неУ меня нет такого метода, более того, логика запроса также не выглядит точной.

Любые предложения приветствуются.Спасибо

1 Ответ

0 голосов
/ 16 сентября 2018

Вы можете использовать отношение BelongsToMany, чтобы получить technicalDescriptions напрямую:

class Company extends Model {
    public function technicalDescriptions() {
        return $this->belongsToMany(
            'Noetic\Plugins\Conxn\Models\Project\TechnicalDescription',
             'project_associate_company',
             'company_id',
             'project_id',
             null,
             'project_id'
        );
    }
}

$company = Company::where('status', 'saved')
    ->withCount(['technicalDescriptions as project_value' => function($query) {
        $query->select(DB::raw('sum(construction_cost)'));
    }])
    ->orderByDesc('project_value')
    ->paginate();
...