Сумма отношений Laravel для атрибута добавления

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

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

<?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();

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

это может вам помочь stackoverflow.com/questions/21679678/…

Vision Coderz 06.09.2018 11:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
1
1 389
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

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

Спасибо чувак! ответ: мы не можем суммировать добавленные атрибуты, поэтому нам нужно создать собственный запрос, как вы сказали

Agus Sumawigena 07.09.2018 04:17

Другие вопросы по теме