Задать вопрос
@fedot1325

Как правильно настроить отношения между моделями в phalcon?

Всем привет.
Только недавно начал осваивать phalcon, и столкнулся с некоторыми проблемами, когда решил прикручивать бд.
Облазил кучу тем, но так и не смог в своем случае настроить отношения между моделями.
Я хочу вытягивать из бд title и т.д, вот так пытался реализовать:
ControllerBase:
<?php
namespace Coursor\Controllers;

use Coursor\Models\Pages;
use Coursor\Models\PageSeo;

class ControllerBase extends \Phalcon\Mvc\Controller {

    protected function checkAjaxRequired() {
        if (!$this->request->isAjax()) {
            $this->response->setStatusCode(404, "Not Found");

            $this->dispatcher->forward(array(
				'namespace' => 'Coursor\Controllers',
				'controller' => 'errors',
				'action' => 'error404'
            ));
            return false;
        }
        return true;
    }

    public function initialize() {

		$action = $this->router->getActionName();
		$controller = $this->router->getControllerName();

        $pages = Pages::findFirst(array(
			"page_controller = :controller: AND page_action = :action:",
			"bind" => array(
				"controller" => $controller,
				"action" => $action
			)
		));
		
		$pageSeo = PageSeo::findFirstByPage_id($pages->id);

        if (count($pages) != 0) {
			$this->tag->setTitle($pageSeo->page_title . ' ' . count($pages));
        }
		else{
            $this->tag->setTitle('NO TITLE');
		}
    }
}


Pages model:
<?php
namespace Coursor\Models;

use Phalcon\Mvc\Model;

class Pages extends Model {

    public $id;

    public $page_controller;
	
    public $page_action;
	
    public function initialize() {
		$this->setSource("pages");
        $this->hasMany("id", "Coursor\Models\PageSeo", "page_id", array(
            'alias' => 'pageSeo'
        ));
    }

}


PageSeo model:
<?php
namespace Coursor\Models;

use Phalcon\Mvc\Model;

class PageSeo extends Model {

    public $id;

    public $page_id;

    public $page_title;
	
	public $meta_description;
   
    public $meta_keywords;

    public function initialize() {
		$this->setSource("page_seo");
        $this->belongsTo("page_id", "Coursor\Models\Pages", "id", array(
			'alias' => 'page'
		));
    }

}


Вроде такой способ работает, но не все гладко, при использовании Pages::findFirst, count($pages) всегда равен 1, даже если записи нет в бд, а при использовании Pages::find, count($pages) работает как надо, но перестает работать $pages->id.
Подскажите, как сделать правильно?

UPD
Спасибо, проблему с отображением отсутствия записи в базе решил. Остался вопрос о правильном использовании отношений как в примере в доках:
$robot = Robots::findFirst();
$robotsParts = $robot->robotsParts; // all the related records in RobotsParts

только
$pages = Pages::findFirst(array(
			"page_controller = :controller: AND page_action = :action:",
			"bind" => array(
				"controller" => $controller,
				"action" => $action
			)
		));
		
		$pages->pageSeo->page_title; //для отображения тайтла страницы

такое сделать не получается.
  • Вопрос задан
  • 762 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
abler98
@abler98
Software Engineer
Pages::find() - возвращает массив записей
Pages::findFirst() - возвращает одну запись
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы