为什么这个错误 1066 出现在连接语句中
Why does this error 1066 show up from join statesment
我还有一个问题。我正在尝试加入 2 tables 以便我可以从两者中提取数据。我是 TableGateway 的新手,在发现相同情况时遇到问题。我有一个页面可以按状态提取博客,我也有一个状态 table。我想使用 state_id 加入这些,并在页面上从状态 table 显示 "state"。以下是我所拥有的。不确定我是否使用了正确的代码!
型号 - 来自州Table:
public function getState($state)
{
$sqlSelect = $this->tableGateway->getSql()->select();
$sqlSelect->columns(array('state_id'));
$sqlSelect->join('states', 'states.state_id = state_id', array('state'), 'inner');
$statement = $this->tableGateway->getSql()->prepareStatementForSqlObject($sqlSelect);
$resultSet = $statement->execute();
return $resultSet;
}
模型来自 PostTable:
public function getbystate($state_id)
{
$state_id = (int) $state_id;
$rowset = $this->tableGateway->select(array('state_id' => $state_id));
return $rowset;
}
控制器动作:
public function ListAction()
{
$state_id = $this->params()->fromRoute('state_id');
$state = $this->params('state');
$list = $this->getPostsTable()->getbystate($state_id);
$states = $this->getStatesTable()->getState($state);
$view = new ViewModel(array(
'list' => $list,
'states' => $states,
));
return $view;
}
更新 8:41 美国东部时间 2017 年 6 月 6 日
我将联接放在 Posts 模块中,而不是状态模型中。
我已经摆脱了错误,但我仍然需要知道如何显示状态。除了驻留在 posts 模块中之外,上面的所有内容都是相同的。
下面是 "View" - 它出错了
注意:Undefined 属性: Zend\Db\Adapter\Driver\Pdo\Result::$state in /var/www/html/module/Blog/view/blog/list.phtml on line 6
查看:
$title = 'My Blog';
$this->headTitle($title);
?>
<h1><?php echo $this->escapeHtml($title); ?></h1>
<td><?php echo $this->escapeHtml($states->state);?></td>
<table class="table">
<tr>
<th>Title</th>
<th>View</th>
<th>Comments</th>
<th>Post Date</th>
</tr>
<?php foreach ($list as $posts) : ?>
<tr>
<td>
<a href="/Blog/view/<?php echo $this->escapeHtml($posts->post_id);?>">
<?php echo $this->escapeHtml($posts->post_title);?>
</a>
</td>
<td><?php echo $this->escapeHtml($posts->num_views);?></td>
<td><?php echo $this->escapeHtml($posts->num_comments);?></td>
<td><?php echo $this->escapeHtml($posts->post_date);?></td>
</tr>
<?php endforeach; ?>
</table>
已添加 tables 12:01 EST 06/07/2017
Post Table:
CREATE TABLE `posts` (
`post_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`state_id` smallint(6) DEFAULT NULL,
`created_user_id` int(11) DEFAULT NULL,
`post_title` varchar(255) NOT NULL,
`post_date` datetime DEFAULT NULL,
`is_active` tinyint(4) NOT NULL,
`status` enum('deleted','draft','inactive','active') DEFAULT 'inactive',
`activate_date` datetime DEFAULT NULL,
`is_hot` tinyint(4) DEFAULT '0',
`ordering` int(11) DEFAULT '0',
`num_views` int(11) DEFAULT '0',
`allow_comment` tinyint(4) DEFAULT NULL,
`num_comments` int(11) DEFAULT '0',
`picLink` varchar(50) DEFAULT NULL,
`description` varchar(1000) DEFAULT NULL,
`food` enum('Yes',' No') DEFAULT NULL,
PRIMARY KEY (`post_id`),
KEY `idx_latest` (`status`,`activate_date`),
KEY `idx_latest_category` (`state_id`,`status`,`activate_date`),
KEY `idx_most_commented` (`state_id`,`status`,`num_comments`) USING BTREE,
KEY `idx_most_viewed` (`state_id`,`status`,`num_views`) USING BTREE,
KEY `idx_most_viewed_2` (`status`,`num_views`),
KEY `idx_created_user` (`created_user_id`,`post_id`)
州 Table:
CREATE TABLE `states` (
`state_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`state` varchar(45) NOT NULL,
PRIMARY KEY (`state_id`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8;
您无需加入 posts
和 states
表即可根据您的 list.phtml
显示 状态 。您正在尝试像 $states->state
那样输出 state 因此,这完全是外部循环。所以你需要获取一个对象,你可以从中以你想要的方式输出状态。在 StatesTable
模型中创建另一个方法以使其工作。见下文
public function getStateById($state_id)
{
$state_id = (int) $state_id;
$rowset = $this->tableGateway->select(array('state_id' => $state_id));
$row = $rowset->current();
if (!$row) {
throw new \Exception("Could not find row $state_id");
}
return $row;
}
和 PostsTable
模型中的 getbystate($state_id)
方法应该像您上面写的那样保持不变。 listAction()
方法应该如下
public function ListAction()
{
$state_id = $this->params()->fromRoute('state_id');
$list = $this->getPostsTable()->getbystate($state_id);
$states = $this->getStatesTable()->getStateById($state_id);
$view = new ViewModel(array(
'list' => $list,
'states' => $states,
));
return $view;
}
现在,正如我告诉您的 sql 连接两个表的查询不正确,那将是这样
public function getState($state)
{
$state = (string) $state;
$sqlSelect = $this->tableGateway->getSql()->select();
// Specify columns from 'posts' table
$sqlSelect->columns(array('post_title', 'description', 'etc'));
// Here you can specify columns for 'states' table
$sqlSelect->join('states', 'posts.post_id = states.state_id', array('state', 'etc'), 'inner');
// Apply conditions here
$sqlSelect->where(array('states.state' => $state));
$resultSet = $this->tableGateway->selectWith($sqlSelect);
return $resultSet;
}
此方法有一个限制。由于结果集原型问题,您无法将此结果集对象转换为数组。但这会以某种方式起作用。
我还有一个问题。我正在尝试加入 2 tables 以便我可以从两者中提取数据。我是 TableGateway 的新手,在发现相同情况时遇到问题。我有一个页面可以按状态提取博客,我也有一个状态 table。我想使用 state_id 加入这些,并在页面上从状态 table 显示 "state"。以下是我所拥有的。不确定我是否使用了正确的代码!
型号 - 来自州Table:
public function getState($state)
{
$sqlSelect = $this->tableGateway->getSql()->select();
$sqlSelect->columns(array('state_id'));
$sqlSelect->join('states', 'states.state_id = state_id', array('state'), 'inner');
$statement = $this->tableGateway->getSql()->prepareStatementForSqlObject($sqlSelect);
$resultSet = $statement->execute();
return $resultSet;
}
模型来自 PostTable:
public function getbystate($state_id)
{
$state_id = (int) $state_id;
$rowset = $this->tableGateway->select(array('state_id' => $state_id));
return $rowset;
}
控制器动作:
public function ListAction()
{
$state_id = $this->params()->fromRoute('state_id');
$state = $this->params('state');
$list = $this->getPostsTable()->getbystate($state_id);
$states = $this->getStatesTable()->getState($state);
$view = new ViewModel(array(
'list' => $list,
'states' => $states,
));
return $view;
}
更新 8:41 美国东部时间 2017 年 6 月 6 日
我将联接放在 Posts 模块中,而不是状态模型中。 我已经摆脱了错误,但我仍然需要知道如何显示状态。除了驻留在 posts 模块中之外,上面的所有内容都是相同的。
下面是 "View" - 它出错了 注意:Undefined 属性: Zend\Db\Adapter\Driver\Pdo\Result::$state in /var/www/html/module/Blog/view/blog/list.phtml on line 6
查看:
$title = 'My Blog';
$this->headTitle($title);
?>
<h1><?php echo $this->escapeHtml($title); ?></h1>
<td><?php echo $this->escapeHtml($states->state);?></td>
<table class="table">
<tr>
<th>Title</th>
<th>View</th>
<th>Comments</th>
<th>Post Date</th>
</tr>
<?php foreach ($list as $posts) : ?>
<tr>
<td>
<a href="/Blog/view/<?php echo $this->escapeHtml($posts->post_id);?>">
<?php echo $this->escapeHtml($posts->post_title);?>
</a>
</td>
<td><?php echo $this->escapeHtml($posts->num_views);?></td>
<td><?php echo $this->escapeHtml($posts->num_comments);?></td>
<td><?php echo $this->escapeHtml($posts->post_date);?></td>
</tr>
<?php endforeach; ?>
</table>
已添加 tables 12:01 EST 06/07/2017 Post Table:
CREATE TABLE `posts` (
`post_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`state_id` smallint(6) DEFAULT NULL,
`created_user_id` int(11) DEFAULT NULL,
`post_title` varchar(255) NOT NULL,
`post_date` datetime DEFAULT NULL,
`is_active` tinyint(4) NOT NULL,
`status` enum('deleted','draft','inactive','active') DEFAULT 'inactive',
`activate_date` datetime DEFAULT NULL,
`is_hot` tinyint(4) DEFAULT '0',
`ordering` int(11) DEFAULT '0',
`num_views` int(11) DEFAULT '0',
`allow_comment` tinyint(4) DEFAULT NULL,
`num_comments` int(11) DEFAULT '0',
`picLink` varchar(50) DEFAULT NULL,
`description` varchar(1000) DEFAULT NULL,
`food` enum('Yes',' No') DEFAULT NULL,
PRIMARY KEY (`post_id`),
KEY `idx_latest` (`status`,`activate_date`),
KEY `idx_latest_category` (`state_id`,`status`,`activate_date`),
KEY `idx_most_commented` (`state_id`,`status`,`num_comments`) USING BTREE,
KEY `idx_most_viewed` (`state_id`,`status`,`num_views`) USING BTREE,
KEY `idx_most_viewed_2` (`status`,`num_views`),
KEY `idx_created_user` (`created_user_id`,`post_id`)
州 Table:
CREATE TABLE `states` (
`state_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`state` varchar(45) NOT NULL,
PRIMARY KEY (`state_id`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8;
您无需加入 posts
和 states
表即可根据您的 list.phtml
显示 状态 。您正在尝试像 $states->state
那样输出 state 因此,这完全是外部循环。所以你需要获取一个对象,你可以从中以你想要的方式输出状态。在 StatesTable
模型中创建另一个方法以使其工作。见下文
public function getStateById($state_id)
{
$state_id = (int) $state_id;
$rowset = $this->tableGateway->select(array('state_id' => $state_id));
$row = $rowset->current();
if (!$row) {
throw new \Exception("Could not find row $state_id");
}
return $row;
}
和 PostsTable
模型中的 getbystate($state_id)
方法应该像您上面写的那样保持不变。 listAction()
方法应该如下
public function ListAction()
{
$state_id = $this->params()->fromRoute('state_id');
$list = $this->getPostsTable()->getbystate($state_id);
$states = $this->getStatesTable()->getStateById($state_id);
$view = new ViewModel(array(
'list' => $list,
'states' => $states,
));
return $view;
}
现在,正如我告诉您的 sql 连接两个表的查询不正确,那将是这样
public function getState($state)
{
$state = (string) $state;
$sqlSelect = $this->tableGateway->getSql()->select();
// Specify columns from 'posts' table
$sqlSelect->columns(array('post_title', 'description', 'etc'));
// Here you can specify columns for 'states' table
$sqlSelect->join('states', 'posts.post_id = states.state_id', array('state', 'etc'), 'inner');
// Apply conditions here
$sqlSelect->where(array('states.state' => $state));
$resultSet = $this->tableGateway->selectWith($sqlSelect);
return $resultSet;
}
此方法有一个限制。由于结果集原型问题,您无法将此结果集对象转换为数组。但这会以某种方式起作用。