#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..