Модель Laravel - функция возврата максимальной и минимальной цены - PullRequest
1 голос
/ 28 сентября 2019

В Laravel у меня есть модель предложения и модель цены предложения.Цена предложения имеет «личный» столбец, который определяет, является ли цена «личной» или «деловой» ценой.То, что я хотел бы сделать, это позвонить в предложение с соотношением цен и вернуть «самую высокую личную цену», «самую низкую личную цену», «самую высокую деловую цену» и «самую низкую деловую цену».

Я думаю назвать что-то вроде:

Offer::with('Information', 'OfferPrice.highestPersonalPrice', 'OfferPrice.lowestPersonalPrice', 'OfferPrice.highestBusinessPrice', 'OfferPrice.lowestBusinessPrice')->get();

Что бы вернуть что-то вроде:

{
    "id": 1,
    "name": "test offer",
    "description": "offer description",
    "Information": {
        "source": "Contact 1",
        "status": "3"
    },
    "max_personal_price": 1345.32,
    "min_personal_price": 456.43,
    "max_business_price": 1245.32,
    "min_business_price": 432.32
}

Вот пример текущей таблицы offer_prices:

offer_id .   deposit .   price .  personal .   status .   expiry
1            300         1345.32  1            1          null
1            200         456.43   1            1          null
1            250         950.32   1            1          null
1            150         740.32   0            1          null
1            200         432.32   0            1          null
1            250         1245.32  0            1          null          

Текущая модель предложения:

namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\SoftDeletes;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;

class Offer extends Model implements AuthenticatableContract, AuthorizableContract
{
    use Authenticatable, Authorizable, SoftDeletes;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'info_id','approved','expiry','branch_id'
    ];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */

    protected $hidden = ['deleted_at'];

    public $timestamps = true;

    protected $dates = [
        'deleted_at'
    ];

    public function prices()
    {
        return $this->hasMany('App\OfferPrice');
    }

    public function information()
    {
        return $this->belongsTo('App\Information');
    }

}

Модель OfferPrice:

namespace App;

use Illuminate\Database\Eloquent\Model;

class OfferPrice extends Model {

    protected $fillable = ['offer_id', 'deposit', 'price', 'personal', 'expiry', 'status'];

    protected $hidden = ['status', 'offer_id', 'created_at', 'updated_at', 'deleted_at'];

    protected $primaryKey = ['offer_id', 'deposit','personal'];

    public $incrementing = false;

    public $timestamps = true;

    public function offers()
    {
        return $this->belongsTo('App\Offer');
    }

}

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

1 Ответ

1 голос
/ 28 сентября 2019

Не в состоянии понять ваш вопрос очень правильно, но если вы хотите максимальную и минимальную цену модели OfferPrice, это будет OfferPrice::max('price') и OfferPrice::min('price'), а при использовании отношения из модели Offer это будет Offer::first()->prices->max('price') и Offer::first()->prices->min('price')Я думаю, что вы поняли из моего ответа, вы можете попробовать и дать мне знать, если я не понял ваш вопрос, пожалуйста, прокомментируйте мой ответ или отредактируйте ваш вопрос.

В модели OfferPrice

public function scopePersonal($query, $param) {
    return $query->where('personal', 1);
}

и

$offer::(‘Information’)->prices()->personal(1)->max(‘price’);
...