У меня есть представление, в котором отображаются подробные сведения о конкретной конференции (название, описание, цена и т. д.).
Чтобы показать каждую информацию, которую я использую: {{$conf->name}}, {{$conf->descrption}}, etc.
Но в случае с ценой у конференции нет цены. У каждой конференции может быть много типов регистрации. У каждого типа регистрации своя цена.
Цена указана в столбце таблицы RegistrationType, а не в таблице Conference.
В представлении сведений о конференции я хочу показать диапазон цен, например, если конференция имеет 3 типа регистрации и минимальная цена одного из типов регистрации равна «0», а максимальная - «10», которую я хочу показать в просмотрите диапазон типов регистрации этой конференции, то есть «0-10».
Но я не понимаю, как можно отобразить в представлении диапазон цен для типов регистрации, существующих для конкретной конференции, знаете ли вы?
Модель конференции и модель RegistrationType похожи на:
Модель конференции:
class Event extends Model
{
// A conference has many registration types
public function registrationTypes(){
return $this->hasMany('App\RegistrationType', 'conference_id');
}
}
RegistrationType Модель:
class RegistrationType extends Model
{
public function conference(){
return $this->belongsTo('App\Conference');
}
}






Пример кода будет примерно таким:
class Event extends Model
{
public function registrationTypes(){
return $this->hasMany('App\RegistrationType', 'conference_id');
}
public function priceRangeAttribute() {
$registrationTypes = $this->registrationTypes();
return $this->orderPriceRanges($registrationTypes);
}
private function orderPriceRanges($registrationTypes) {
// process the collection and format the different prices (0, 2, 10)
// into a price range like 0-10
}
}
Затем вы получите доступ к нему как $ conf-> price_range.
Спасибо, но вроде появляется «Вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: registrationPriceRange». Ты знаешь почему?
Извините, я пишу это в голове. Я обновил пример, переименовав метод в метод доступа laravel.com/docs/5.6/eloquent-mutators#defining-an-accessor, а также способ его вызова.
Спасибо!! В orderPriceRanges у меня есть частная функция orderPriceRanges ($ registrationTypes) {foreach ($ registrationTypes as $ rtype) {return "price"; }} для проверки, но в представлении ничего не отображается. Ты знаешь почему?
Попробуйте отладить значения переменных с помощью отладчика или простых вызовов dd($registrationTypes);.
Вы также можете использовать методы сбора в $ registrationTypes, поскольку это должно быть Collection. Например, вы можете $registrationTypes->sortBy('price')->pluck('price');, чтобы получить заказанные цены. Тогда вы можете return $orderedPrices->min() . "-" . $orderedPrices->max().
Спасибо. Не знаю почему, но цена все еще не появляется. Кажется, что метод не вызывается, с этой "частной функцией orderPriceRanges ($ registrationTypes) {dd ($ registrationTypes);}" ничего не показывает.
С "общедоступной функцией priceRangeAttribute () {$ registrationTypes = $ this-> registrationTypes (); dd ($ registrationTypes);}" также ничего не показывает.
Я бы сделал это так (при условии, что Event на самом деле является вашим классом Conference):
class Conference extends Model
{
protected $appends = ['price_range'];
public function registrationTypes(){
return $this->hasMany('App\RegistrationType', 'conference_id');
}
public function getPriceRangeAttribute() {
return $this->registrationTypes()->get()->min('price') . ' - ' . $this->registrationTypes()->get()->max('price');
/* The first answer :
* return $this->registrationTypes()->min('price') . ' - ' . $this->registrationTypes()->max('price');
* should also do it, and could even be better, because no
* other results than the actual min and max are returned,
* no collection fetched ! */
}
}
Здесь вы указываете Laravel добавляет атрибут ценовой диапазон для каждого экземпляра Конференция. Атрибут ценовой диапазон возвращается getPriceRangeAttributeаксессуар, который проверяет минимум и максимум, найденные в столбце цен для каждого registrationType, связанного (возвращенного отношением hasMany) с вашей Конференцией.
Спасибо, но вот так во внешнем интерфейсе с помощью "{{$ conf-> price_range}}" появляется "строка (148)" выберите min (price) как агрегат из registration_types, где registration_types.conf_id =? и registration_types.conf_id не является нулевой «строка (148)», выберите max (price) как совокупность из registration_types, где registration_types.conf_id =? и registration_types.conf_id не равно нулю "2-10", а не показывает диапазон цен. Ты знаешь почему?
Теперь появляется сообщение «Вызов функции-члена get () с плавающей точкой» при возврате $ this-> registrationTypes () -> min ('price') -> get (). '-'. $ This-> registrationTypes () -> max ('цена') -> get (); ".
Повторно отредактировано. Я считаю, что метод get должен вызываться перед методами min и max
Спасибо, но снова возникает та же проблема: «строка (124)» выберите * из registration_types, где registration_types.conf_id =? и registration_types.conf_id не является нулевой «строка (124)» выберите * из registration_types, где registration_types.conf_id =? и registration_types.conf_id не равен нулю "2-10".
Вы где-то регистрируете свой запрос или отношения? С print_r или что-то в этом роде?
Позвольте нам продолжить обсуждение в чате.
Вы можете сделать что-то вроде $ conference-> registrationTypes () и получить коллекцию всех типов регистрации. Вы также можете обернуть это во вспомогательный метод самой модели конференции (события), чтобы вычислить диапазон.