PhalconPHP数据库加入ORM

时间:2014-07-17 11:29:52

标签: php mysql join orm phalcon

我很难理解Phalcon中的连接。我不确定我是否需要使用连接或者是否以某种方式自动映射相关表。我以前总是避免使用ORM,所以这个概念对我来说有点新鲜了!

我有两个表 - 页面和部分

 class Pages extends \Phalcon\Mvc\Model {

    public $page_id;
    public $page_section_id;
    public $page_title;
    public $page_url;
    public $page_description;
    public $page_tags;
    public $page_content;
    public $page_time;
    public $page_author;
    public $page_views;

    public function initialize() {
        $this->belongsTo('page_author', 'users', 'id');
        $this->belongsTo('page_section_id', 'sections', 'section_id');
    }

}

class Sections extends \Phalcon\Mvc\Model{

    public $section_id;
    public $section_title;
    public $section_url;
    public $section_description;
    public $section_tags;

    public function initialize(){
        $this->hasMany('section_id', 'pages', 'page_section_id');
    }
}

然后在我的控制器中我有

$pages = $this->modelsManager->createBuilder()
        ->from('Baseapp\Backend\Models\Pages')
        ->leftJoin('Baseapp\Backend\Models\Sections', 'section.section_id = Baseapp\Backend\Models\Pages.page_section_id', 'section')
        ->orderBy('page_time DESC')
        ->getQuery()
        ->execute()
        ->toArray();
    print_r($pages);exit; // <- let's see what we get here

我正在使用$this->modelsManager->createBuilder(),因为我似乎无法加入它!

在视图中我会使用

{% for page in pages %}
    <div class="item">
        <div class="content">
            <div class="header">
                {{ page.page_title }} - {{ page.section_title }}
            </div>
        </div>
    </div>
{% endfor %}

这里最大的问题是它只返回页面数据而不是相关的部分数据。换句话说,连接似乎没有起作用。

那么我该如何进行简单连接,或者是否有一些更好的方法可以忽略连接使得连接多余?

1 个答案:

答案 0 :(得分:1)

在模型中,您需要创建一个方法,例如

/**
 * Returns users which doesn't belong to any organization.
 *
 * @return mixed
 */
public static function getSomething()
{
    $query = User::query()
        ->columns(__NAMESPACE__ . '\Pages.*')
        ->leftJoin(__NAMESPACE__ . '\Sections', __NAMESPACE__ . '\Pages.page_section_id = ps.section_id', 'ps')
        ->where('do something')
        ->execute();

    if ($query->count()) {
        return $query;
    }

    return false;
}