LINKE VERBINDUNG in ZF2 mit TableGateway
Ich habe eine Tabelle:
*CREATE TABLE IF NOT EXISTS `blogs_settings` (
`blog_id` int(11) NOT NULL AUTO_INCREMENT,
`owner_id` int(11) NOT NULL,
`title` varchar(255) NOT NULL,
`meta_description` text NOT NULL,
`meta_keywords` text NOT NULL,
`theme` varchar(25) NOT NULL DEFAULT 'default',
`is_active` tinyint(1) NOT NULL DEFAULT '1',
`date_created` int(11) NOT NULL,
PRIMARY KEY (`blog_id`),
KEY `owner_id` (`owner_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;*
Und die zweite Tabelle:
*CREATE TABLE IF NOT EXISTS `users` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`password` varchar(128) NOT NULL,
`sex` tinyint(1) NOT NULL,
`birthday` date NOT NULL,
`avatar_id` int(11) DEFAULT NULL,
`user_level` tinyint(1) NOT NULL DEFAULT '1',
`date_registered` int(11) NOT NULL,
`is_active` tinyint(1) NOT NULL DEFAULT '0',
`is_banned` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`user_id`),
KEY `is_active` (`is_active`),
KEY `user_level` (`user_level`),
KEY `is_banned` (`is_banned`),
KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;*
Wie kann ich wählen Sie alle Felder aus blogs_settings-Tabelle und der join nur das 'username' Feld aus der Tabelle users mit TableGateway in ZF2, auf blogs_settings.owner_id = users.user_id
. Vielen Dank im Voraus. Ihre Hilfe wird viel geschätzt.
EDIT:
namespace Object\Model;
use Zend\Db\TableGateway\TableGateway;
use Zend\Db\Sql\Select;
class BlogsSettingsTable {
protected $tableGateway;
protected $select;
public function __construct(TableGateway $tableGateway) {
$this->tableGateway = $tableGateway;
$this->select = new Select();
}
public function getBlogs($field = '', $value = '') {
$resultSet = $this->tableGateway->select(function(Select $select) {
$select->join('users', 'blogs_settings.owner_id = users.user_id', array('username'));
});
return $resultSet;
}
public function getBlog($blogID) {
$id = (int) $blogID;
$rowset = $this->tableGateway->select(array('blog_id' => $id));
$row = $rowset->current();
if (!$row) {
throw new Exception('Could not find row with ID = ' . $id);
}
return $row;
}
public function addBlog(BlogsSettings $blog) {
$data = array(
'owner_id' => $blog->owner_id,
'title' => $blog->title,
'meta_description' => $blog->meta_description,
'meta_keywords' => $blog->meta_keywords,
'theme' => $blog->theme,
'is_active' => $blog->is_active,
'date_created' => $blog->date_created,
);
$this->tableGateway->insert($data);
}
public function deleteBlog($blogID) {
return $this->tableGateway->delete(array('blog_id' => $blogID));
}
}
Mit diesem, wird die folgende Abfrage ausgeführt:
WÄHLEN Sie blogs_settings
.*, users
.username
ALS username
AUS blogs_settings
INNER JOIN users
AUF blogs_settings
.owner_id
= users
.user_id
aber das resultSet enthält nicht die username-Feld aus der verknüpften Tabelle 'users'. Allerdings, wenn ich die Abfrage im phpmyadmin ist alles okay und ich hab das "Benutzername" - Feld aus der Tabelle 'users' angehört. Was ist das problem?
EDIT 2
ok, ich habe nun versucht, die folgenden:
public function getBlogs() {
$select = $this->tableGateway->getSql()->select();
$select->columns(array('blog_id', 'interest_id', 'owner_id', 'title', 'date_created'));
$select->join('users', 'users.user_id = blogs_settings.owner_id', array('username'), 'left');
$resultSet = $this->tableGateway->selectWith($select);
return $resultSet;
}
die ausgeführte Abfrage:
SELECT `blogs_settings`.`blog_id` AS `blog_id`, `blogs_settings`.`interest_id` AS `interest_id`, `blogs_settings`.`owner_id` AS `owner_id`, `blogs_settings`.`title` AS `title`, `blogs_settings`.`date_created` AS `date_created`, `users`.`username` AS `username` FROM `blogs_settings` LEFT JOIN `users` ON `users`.`user_id` = `blogs_settings`.`owner_id`
Wenn ich es in phpmyadmin, es schließt sich das Feld Benutzername aus der Benutzer-Tabelle. Wenn in zf2, gibt es nicht.
Hier ist der dump des gesamten Objekts:
Zend\Db\ResultSet\ResultSet Object
(
[allowedReturnTypes:protected] => Array
(
[0] => arrayobject
[1] => array
)
[arrayObjectPrototype:protected] => Object\Model\BlogsSettings Object
(
[blog_id] =>
[interest_id] =>
[owner_id] =>
[title] =>
[meta_description] =>
[meta_keywords] =>
[theme] =>
[is_active] =>
[date_created] =>
)
[returnType:protected] => arrayobject
[buffer:protected] =>
[count:protected] => 1
[dataSource:protected] => Zend\Db\Adapter\Driver\Pdo\Result Object
(
[statementMode:protected] => forward
[resource:protected] => PDOStatement Object
(
[queryString] => SELECT `blogs_settings`.`blog_id` AS `blog_id`, `blogs_settings`.`interest_id` AS `interest_id`, `blogs_settings`.`owner_id` AS `owner_id`, `blogs_settings`.`title` AS `title`, `blogs_settings`.`date_created` AS `date_created`, `users`.`username` AS `username` FROM `blogs_settings` LEFT JOIN `users` ON `users`.`user_id` = `blogs_settings`.`owner_id`
)
[options:protected] =>
[currentComplete:protected] =>
[currentData:protected] =>
[position:protected] => -1
[generatedValue:protected] => 0
[rowCount:protected] => 1
)
[fieldCount:protected] => 6
[position:protected] =>
)
... Irgendwelche Ideen?
__construct(TableGateway $tableGateway)
) InformationsquelleAutor der Frage | 2013-02-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen @samsonasik die Antwort und Lösung der Probleme in Ihrem Kommentar. Sie werden nicht in der Lage zu Holen Sie sich die verknüpften Werte aus, was zurückgegeben wird von dieser Erklärung. Diese Aussage gibt das Modell-Objekt, das nicht die verknüpften Zeilen. Sie müssen, um es auszuführen, wie SQL auf einem Niveau, das vorbereiten, die es als raw-SQL und kehren Sie jede resultierende Zeile als array, sondern als Objekt:
InformationsquelleAutor der Antwort Pakage
wenn Sie TableGateway, können Sie beitreten, wie dies
InformationsquelleAutor der Antwort samsonasik
Müssen Sie die Benutzernamen-Feld in der BlogsSetting Modell wird als Modell von BlogsSettingTable (Das TableGateway)
Hoffe, das hilft
InformationsquelleAutor der Antwort Rid Zeal
Dies ist der genaue Bedarf für beide Join und Wo Klauseln mit tableGateway.
InformationsquelleAutor der Antwort Dhiraj
In Ihrer Klasse geerbt von AbstractTableGateway u verwenden können, Wählen Sie mit der Schließung wie diese:
InformationsquelleAutor der Antwort TobiasDeVil
Probieren Sie es aus:
Hinzufügen zu "getServiceConfig ()" in Module.php:
InformationsquelleAutor der Antwort webcoder
seit der OP noch nicht angenommen keine Antwort, ich werde versuchen zu geben, die Lösung.
Ich Gesicht die gleiche Lösung wie die OP Mitgliedstaaten und der einzige Weg, um es zu beheben ist, durch hinzufügen folgender Zeile in die model-Klasse (in diesem Fall könnte 'Blogsetttings.php').
sollten Sie fügen Sie über der Zeile, um die exchangeArray () - Methode.
Hoffe es hilft
InformationsquelleAutor der Antwort Ferdi Brown Kurniawan