Я работаю с php, и у меня есть два объекта: сообщение и сообщение. Сообщение является атрибутом в сущности сообщения, и предполагается, что оно является однонаправленным отношением один к одному. Но когда я вызываю message-> getPost () -> getText () в своем контроллере, я получаю это сообщение об ошибке:
Trying to get property of non-object in C:\wamp64\www\Test\monApplication\controller\mainController.php
Сущность сообщения:
<?php
/**
* @Entity
* @Table(name = "message")
*/
class message{
/** @Id @Column(type = "integer")
* @GeneratedValue
*/
public $id;
/**
* @ORM\OneToOne(targetEntity = "post", cascade = {"persist"})
* @JoinColumn(name = "post", referencedColumnName = "id")
*/
private $post;
/** @Column(type = "integer") */
public $likes;
public function getPost(){
return $this->post;
}
public function getLikes(){
return $this->likes;
}
}
?>
Сущность Post
<?php
/**
* @Entity
* @Table(name = "post")
*/
class post{
/** @Id @Column(type = "integer")
* @GeneratedValue
*/
public $id;
/** @Column(type = "string", length=2000) */
public $texte;
/** @Column(type = "string", length=200) */
public $image;
/** @Column(type = "TIMESTAMP", length=4000) */
public $date;
}
?>
Мой класс dbconnection:
<?php
define ('HOST', 'localhost') ;
define ('USER', 'root' ) ;
define ('PASS', '' ) ;
define ('DB', 'tp' ) ;
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
class dbconnection{
private static $instance=null, $entityManager;
private $error=null ;
private function __construct(){
$config = Setup::createAnnotationMetadataConfiguration(array("../../monApplication/model/"), true);
$param = array(
'dbname' => DB,
'user' => USER,
'password' => PASS,
'host' => HOST,
'driver' => 'pdo_mysql');
try{
self::$entityManager = EntityManager::create($param, $config);
}
catch(Exception $e) {
echo "Probleme connexion base de données:".$e->getMessage();
$this->error = $e->getMessage();
}
}
public static function getInstance(){
if (self::$instance == null){
self::$instance = new dbconnection();
}
return self::$instance;
}
public function closeConnection(){
self::$instance=null;
}
public function getEntityManager(){
if (!empty(self::$entityManager))
return self::$entityManager;
else
return NULL;
}
public function __clone(){
}
public function getError(){
return $this->error;
}
}
Мой mainController:
<?php
class mainController
{
public static function showMessage($request,$context){
$messages = messageTable::getAllMessages();
echo $message[0]->getPost()->text;
return context::SUCCESS;
}
}
И, наконец, архитектура моего проекта такая:
Я только что добавил к вопросу свой класс mainController, объект $ message не пуст, потому что getLikes () отлично работает
Это просто опечатка, я исправил, но проблема не в этом
Что ж, я думаю, это требует отладки. Есть что-нибудь в $message[0]? Что это за тип?
Это объект сообщения, я могу получить доступ к его атрибуту лайков, но не могу получить доступ к сообщению
Попробуйте var_dump ($ message [0] -> getPost ()). У вас есть сущность? Возможно, отношение не существует или установлено неправильно.
Я не вижу пространств имен и директив использования в предоставленном коде. Убедитесь, что вы используете правильные пространства имен и включаете правильные классы.
Столбец соединения в вашей таблице сообщений называется "post" или, возможно, "post_id"? попробуйте запустить команду проверки doctrine-project.org/projects/doctrine-orm/en/2.6/reference/… и проверьте наличие ошибок в вашей схеме.






Попробуй изменить
private $post;
к
public $post;
(и вы должны использовать защищенные вары)
У вас есть еще 2 проблемы:
/** @Column(type = "string", length=2000) */
public $texte;
Должно быть :
/** @Column(type = "text") */
public $texte;
Потому что длина строки ограничена 255 символами.
И ваша собственность "текстовая", поэтому вы должны иметь
echo $message[0]->getPost()->texte;
вместо
echo $message[0]->getPost()->text;
первое, что я бы посоветовал отладить, так как вы не упомянули об этом (нет ссылки на messageTable)
messageTable::getAllMessages();
используя var_dump () или свалка(), чтобы увидеть тип и проверить, возвращает ли он данные, а затем решить, как вы получите доступ к первому сообщению.
во-вторых, обратите внимание, что нет переменной $ message, есть $ messages (s в конце).
также нет -> текста, есть -> текст
затем исправьте context :: SUCCESS на $ context :: SUCCESS
и, наконец, к счастью было бы больше ошибок, но эй, var_dump () будет вашим другом, так что используйте ее!
Я не вижу в вашем коде, где вызывается
$message->getPost()? Я полагаю, это вmainController.php, который вы не показали. В любом случае, причина этого, скорее всего, в том, что переменная$messageне содержит объекта. Может быть, это нуль?