Сумма отношения Laravel по атрибуту добавления - PullRequest
0 голосов
/ 06 сентября 2018

у меня две модели

это мой материал модель:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class material extends Model
{
    protected $fillable = ['proposal_id','thickness','width','length','qty','description'];
    public $timestamps = false;
    protected $appends = ['total'];
    public function proposal()
    {
        return $this->belongsTo(proposal::class);
    }
    public function getTotalAttribute()
    {
        return $this->qty * $this->price;
    }
}

это мое предложение модель:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class proposal extends Model
{
    public function materials()
    {
        return $this->hasMany(material::class);
    }
}

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

Это не работает:

\App\proposal::with(['materials'=>function($q){
    $q->sum('total');
    }])
    ->get();

как это сделать правильно? спасибо

1 Ответ

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

Часть вашего кода $q->sum('total') выполняет запрос к базе данных, в то время как ваш атрибут total создается в модели, а не в базе данных.

Для быстрого решения вы можете добавить к модели Proposal добавленный атрибут, который вычисляет общее количество всех ее материалов. Вы должны быть осторожны, поскольку можете столкнуться с проблемой N + 1 (https://laravel.com/docs/5.6/eloquent-relationships#eager-loading).

Исходя из этого, вы можете проверить, загружены ли отношения Materials в первую очередь, прежде чем вычислять общее количество? Внутри вашей модели вы можете проверить через $this->relationLoaded('materials').

Наконец, но сложнее, вы можете написать собственный выбор, который использует MySQL (или любую базу данных, которую вы используете) для генерации итоговых значений во время запроса.

Надеюсь, это поможет? Дайте мне знать, если вы хотите обсудить дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...