Я строю крошечный проект, используя Phalcon 3.0.1, просто чтобы узнать, как использовать отношения модели ORM между двумя таблицами, и только в начале столкнулся с первой проблемой при объединении данных из связанных таблиц. Вот мой код SQL для этих таблиц:
CREATE TABLE `jobs` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(100) NOT NULL,
`categories_id` int(11) unsigned NOT NULL,
`location` varchar(255) NOT NULL,
`description` text NOT NULL,
`how_to_apply` text NOT NULL,
`author` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`),
KEY `fk_categories` (`categories_id`),
CONSTRAINT `jobs_ibfk_1` FOREIGN KEY (`categories_id`) REFERENCES `categories` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='utf8_general_ci'CREATE TABLE `categories` (
`id` int(11) unsigned NOT NULL,
`category_name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='utf8_general_ci'
У Jobs есть внешний ключ для категорий (category_id). Теперь, пытаясь установить отношения в моей модели категорий, как:
public function initialize()
{
$this->hasManay('id', 'Jobs', 'categories_id', ['alias' => 'Jobs']);
}
Теперь при вызове метода find Categories::find()
не возвращает связанные данные из таблицы Jobs. Я также заметил, что я могу положить что-нибудь глупое внутри hasMany()
метод, и он даже не поймает исключение. Похоже, это полностью игнорируется. Я даже могу сделать что-то, как показано ниже, и это не даст сбой.
public function initialize()
{
$this->hasManay('stupid', 'Doesnt_exist_table', 'more_stupid', ['alias' => 'Jobs']);
}
Я также хотел бы отметить, что все свойства в моих моделях являются общедоступными. Я ознакомился со всеми документами, другими вопросами о стековом потоке, примерами GitHub и считаю, что это должно сработать. Любая помощь будет оценена, так как я схожу с ума по этому поводу.
Прецедент:
class Jobs extends Phalcon\Mvc\Model
{
public function initialize()
{
$this->belongsTo('categories_id', 'Categories', 'id');
}
}
class Categories extends Phalcon\Mvc\Model
{
public function initialize()
{
$this->hasMany('id', 'Jobs', 'categories_id');
}
}
class TestController extends Phalcon\Mvc\Controller
{
public function testAction()
{
// get the first job
$job = Jobs::findFirst();
// get the (single) category that is related to this job
$jobCategory = $job->getRelated('Categories');// get the first category
$category = Categories::findFirst();
// get all the jobs related to this category
$jobsInThisCategory = $category->getRelated('Jobs');
}
}
Связанные записи будут вызываться только тогда, когда вы ->getRelated()
на вашем объекте.
Так что, если вы определили свое отношение как
$this->hasMany('stupid', 'Doesnt_exist_table', 'more_stupid', ['alias' => 'Jobs']);
А ты позвони $category->getRelated('Jobs')
, вы получите ошибку, потому что эта таблица Doesnt_exist_table
не существует
<?php
namespace App\Models;
use Phalcon\Mvc\Model;class Categories extends Model
{
// ....
public function initialize()
{
$this->hasMany('id', __NAMESPACE__ . '\Articles', 'categories_id', array(
'alias' => 'Categories',
'reusable' => true
));
}
}
use Phalcon\Mvc\Model;
class Articles extends Model
{
// ....
public function initialize()
{
$this->belongsTo("categories_id", __NAMESPACE__ . "\Categories", "id", array(
'alias' => 'Categories',
'reusable' => true
));
}
public function getCategories($parameters = null)
{
return $this->getRelated('Categories', $parameters);
}
}
В контроллере:
public function indexAction()
{
$articles = Articles::find([
'order' => 'id DESC',
'limit' => 2
]);
$this->view->setVar('articles',$articles);
}
В представлении (Вольт):
{% for article in articles %}
{{ article.title }}
// ...
{# Show Categories #}
{{ article.categories.name }}
{# or #}
{{ article.categories.id }}
{# or #}
{{ article.categories.slug }}
{% endfor %}