2017-06-06 5 views
0

J'ai encore un autre problème. J'essaye de joindre 2 tables afin que je puisse tirer des données des deux. Je suis nouveau à TableGateway et j'ai des problèmes à trouver la même situation. J'ai une page qui va tirer les blogs par état et j'ai aussi une table d'état. Je veux les joindre en utilisant state_id et montrer "state" de la table d'état sur la page. Voici ce que j'ai. Je ne sais pas si j'utilise même le bon code!Pourquoi cette erreur 1066 apparaît à partir de l'état de jointure

Modèle - De StateTable:

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; 

}

Modèle de PostTable:

public function getbystate($state_id) 
    { 
    $state_id = (int) $state_id; 
    $rowset = $this->tableGateway->select(array('state_id' => $state_id)); 

    return $rowset; 
    } 

Action de contrôleur:

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; 
} 

Mise à jour 08:41 EST 06/06/2017

Je mets la jointure dans le module Posts au lieu de dans le States Model. Je me suis débarrassé des erreurs mais j'ai encore besoin de savoir comment montrer l'état. Tout ce qui précède est le même sauf qu'il réside dans le module posts.

Le "View" est inférieure à - il des erreurs avis: Undefined property: Zend \ Db \ Adapter \ Driver \ Aop \ Résultat :: $ state dans/var/www/html/module/Blog/view/blog/list.phtml en ligne 6

Vue:

$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 Ajouté 12h01 EST 07/06/2017 Poster Tableau:

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`) 

États Tableau:

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; 
+0

Votre requête sql pour joindre deux tables n'est pas correcte. Seriez-vous capable d'afficher votre table «blog» et «state» s'il vous plaît? – unclexo

+0

@ J.Sajeeb J'ai ajouté les tableaux à la publication.Peut-être que l'indexation n'est pas tout à fait correcte non plus. Quand j'ai fait un taudis j'ai été surpris à toutes les clés. Je ne me souviens pas de faire tout ça. Merci. –

Répondre

0

Vous n'avez pas besoin de se joindre posts et states tables pour montrer état selon votre list.phtml. Vous essayez de sortir l'état là comme $states->state par conséquent, ceci est complètement à l'extérieur de la boucle. Vous devez donc aller chercher un objet à partir duquel vous pouvez sortir l'état comme vous le souhaitez. Faire une autre méthode dans le modèle StatesTable pour le faire fonctionner. Voir la méthode suivante

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; 
} 

Et getbystate($state_id) de PostsTable modèle devrait être inchangé comme vous avez écrit ci-dessus. listAction() méthode doit être le suivant

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; 
} 

Maintenant, comme je l'ai dit à votre requête SQL pour joindre deux tables était pas juste, qui voudrait cette

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; 

} 

Cette méthode a une limitation. Vous ne pouvez pas convertir cet objet resultset en tableau en raison d'un problème de prototype de jeu de résultats. Mais cela fonctionnera d'une manière ou d'une autre.

+0

Merci pour votre aide! –

+0

Vous êtes toujours les bienvenus! Ne pas oublier de voter la réponse plus loin si je peux vous aider! :) – unclexo

+0

J'ai essayé de voter mais ça ne me laissera pas parce que ma réputation a moins de 15 ans. J'ai un autre problème ouvert. Je crois que j'en aurai beaucoup avant que ce projet soit terminé. https://stackoverflow.com/questions/ask?title=ZF2AuthAcl%20Module%20doesnt%20work%20out%20of%20the%20box merci encore! –