Eloquent hasMany не загружает коллекцию

#php #sql #laravel #eloquent

#php #sql #laravel #eloquent

Вопрос:

Я относительно новичок в eloquent, и у меня проблемы с загрузкой данных из отношения hasMany в приложении, которое использует eloquent в качестве уровня базы данных. Мой (упрощенный) код выглядит следующим образом:

 use IlluminateDatabaseEloquentModel;
class Answer extends Model{
    protected $table = 'answer';
    public $timestamps = false;
    public $incrementing = false;
    protected $fillable = [
        "nerdId",
        "invitationid",
        "eatingno",
        "price",
        "haspaid",
        "attending",
        "noeating",
    ];
    public function topping() {
        return $this->hasMany(AnswerTopping::class, 'answerid');
    }
}

class AnswerTopping extends Model{
    protected $table = 'eating';
    public $timestamps = false;
    protected $fillable = [
        'answerid',
        'toppingid',
        'add'
    ];

    public function answer() {
        return $this->belongsTo(Answer::class);
    }
}

  

Схема SQL выглядит следующим образом

 CREATE TABLE `answer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nerdid` int(11) NOT NULL,
  `invitationid` int(11) NOT NULL,
  `eatingno` tinytext,
  `price` float NOT NULL,
  `haspaid` tinyint(4) NOT NULL,
  `attending` tinyint(1) NOT NULL DEFAULT '0',
  `noeating` tinyint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2119 DEFAULT CHARSET=utf8;
CREATE TABLE `eating` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `answerId` int(11) NOT NULL,
  `toppingid` int(11) NOT NULL,
  `add` tinyint(4) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=280 DEFAULT CHARSET=utf8;
  

Затем я выполняю следующий запрос:

     $answer = Answer::with('topping')->find(32);
    return $answer->toJson());
  

Это приводит к json, подобному следующему

 {"id":32,"nerdid":1,"invitationid":54,"eatingno":"51","price":60,"haspaid":1,"attending":2,"noeating":0,"topping":[]}
  

Необработанный SQL-запрос показывает мне, что у меня есть данные в отношении, поэтому он должен возвращать больше в «topping».

ОБНОВЛЕНИЕ Проверка SQL-запросов в mysql (настройка его для ведения журнала), я вижу, что он действительно выполняет ожидаемые запросы к базе данных:

 select * from `answer` where `answer`.`id` = 32 limit 1;
select * from `eating` where `eating`.`answerid` in (32);
  

Ручное выполнение SQL дает мне 2 записи в таблице приема пищи. Но они не отображаются в верхнем json «Ответа».

Комментарии:

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

2. Добавлено больше деталей в сообщение…

3. кстати. базовая база данных взята из более старого воплощения моего проекта, основанного на idiorm. Но поскольку idiorm более или менее мертв, я пытаюсь заставить его работать с eloquent.

Ответ №1:

Найден виновник .. схема базы данных для таблицы «поедания», had answerId (прописная буква I) и отношение в hasMany используется answerid (строчная буква i), что, по-видимому, смутило eloquent..

Теперь я получаю ожидаемый json..