【发布时间】:2016-01-11 11:38:31
【问题描述】:
我正在尝试在 Laravel 中为我的表格创建一个 hasManyThrough。
这是我的表结构的高层次
我有survey_questions 表。 (一个问题属于多个控件survey_questions.id = survey_question_controls.question_id)
我有survey_question_controls 表(许多控件属于一个问题,即survey_question_controls.question_id = survey_questions.id)
我也有survey_control_items(许多项目属于一个控件,即survey_control_items.control_id = survey_question_controls.id)
我需要为问题与项目建立hasManyThrough 关系。
这是我的表定义
CREATE TABLE `survey_questions` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
`survey_id` int(10) unsigned NOT NULL,
`sort` mediumint(9) NOT NULL DEFAULT '0',
`page_number` smallint(5) unsigned NOT NULL,
`is_required` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
`visible_level` enum('All','store','region','district','division') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'All',
`visible_to` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
`visible` enum('Always','conditional') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'Always',
`status` enum('active','inactive') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'active',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `survey_questions_survey_id_index` (`survey_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `survey_question_controls` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`question_id` int(10) unsigned NOT NULL,
`input_type` enum('text','textarea','radio','checkbox','menu','list') COLLATE utf8_unicode_ci NOT NULL,
`sort` mediumint(9) NOT NULL DEFAULT '0',
`validation_rule` enum('none','number','text') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'none',
`min_length` int(10) unsigned DEFAULT NULL,
`max_length` int(10) unsigned DEFAULT NULL,
`min_value` int(11) DEFAULT NULL,
`max_value` int(11) DEFAULT NULL,
`refuse` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
`disqualify` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
`status` enum('active','inactive') COLLATE utf8_unicode_ci NOT NULL DEFAULT 'active',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `survey_question_controls_question_id_index` (`question_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `survey_control_items` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
`control_id` int(10) unsigned NOT NULL,
`sort` mediumint(9) NOT NULL DEFAULT '0',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `survey_control_items_control_id_index` (`control_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
我正在尝试使用 Laravel 的 ORM 获取与此问题类似的数据。
SELECT * FROM survey_questions AS q
INNER JOIN survey_question_controls AS c ON c.question_id = q.id
LEFT JOIN survey_control_items AS i ON i.control_id = c.id
在我的 SurveyQuestions 模型中,我添加了这个关系
/**
* Get items for the controls that belongs to the question
* Questions > controls >
*/
public function items()
{
return $this->hasManyThrough(Surveyquestioncontrols::class, Surveycontrolitems::class, 'question_id', 'id', 'control_id', 'control_id');
}
这给了我以下 SQL 错误
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'survey_control_items.surveyquestioncontrols_id' in 'where clause' (SQL: select * from `survey_control_items` where `survey_control_items`.`surveyquestioncontrols_id` = 1 and `survey_control_items`.`surveyquestioncontrols_id` is not null)
问题 如何创建 hasManyThrough 关系?
已编辑
当您阅读上面的错误时,您会注意到一个不存在的列名survey_control_items.surveyquestioncontrols_id,此列应该是survey_control_items.control_id
另外,根据下面的反馈,我的 items() 方法应该是这样的
/**
* Get items for the controls that belongs to the question
* Questions > controls >
*/
public function items()
{
return $this->hasManyThrough(Surveycontrolitems::class, Surveyquestioncontrols::class, 'question_id', 'control_id');
}
【问题讨论】:
-
我意识到我写的是错误的,这就是我删除它的原因。道歉
标签: php mysql laravel orm laravel-5