Доктрина: связь сущностей OneToOne не работает

Я работаю с 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;
    }
}

И, наконец, архитектура моего проекта такая:

Доктрина: связь сущностей OneToOne не работает

Я не вижу в вашем коде, где вызывается $message->getPost()? Я полагаю, это в mainController.php , который вы не показали. В любом случае, причина этого, скорее всего, в том, что переменная $message не содержит объекта. Может быть, это нуль?

halfer 20.04.2018 23:15

Я только что добавил к вопросу свой класс mainController, объект $ message не пуст, потому что getLikes () отлично работает

Yassine Younes 21.04.2018 00:33

Это просто опечатка, я исправил, но проблема не в этом

Yassine Younes 21.04.2018 02:41

Что ж, я думаю, это требует отладки. Есть что-нибудь в $message[0]? Что это за тип?

halfer 21.04.2018 08:55

Это объект сообщения, я могу получить доступ к его атрибуту лайков, но не могу получить доступ к сообщению

Yassine Younes 21.04.2018 11:07

Попробуйте var_dump ($ message [0] -> getPost ()). У вас есть сущность? Возможно, отношение не существует или установлено неправильно.

Jannes Botis 22.04.2018 20:35

Я не вижу пространств имен и директив использования в предоставленном коде. Убедитесь, что вы используете правильные пространства имен и включаете правильные классы.

Denis Alimov 23.04.2018 07:18

Столбец соединения в вашей таблице сообщений называется "post" или, возможно, "post_id"? попробуйте запустить команду проверки doctrine-project.org/projects/doctrine-orm/en/2.6/reference/‌… и проверьте наличие ошибок в вашей схеме.

mshaps 25.04.2018 00:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
10
8
198
2

Ответы 2

Попробуй изменить

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 () будет вашим другом, так что используйте ее!

Другие вопросы по теме