BASSON_XVI
@BASSON_XVI
Иногда балуюсь, раньше программировал.

Kohana ORM связь has_many и подкатегории правильное отображение?

Добрый день. Есть 2 таблицы Categories и Apps. Они связаны между собой таблицей Categories_Apps. В таблице Categories есть поле parent_id для создания подкатегорий.
Как можно зная Categories ID получить сначало ID всех вложенный детей а потом все записи из таблицы Apps соответствующие этим ID категории и подкатегорий?
Categories:
|id|parent_id|
|1|0|
|2|1|
|3|2|
|4|0|

Categories_Apps:
|category_id|app_id|
|1|1|
|3|2|

Apps:
|id|name|
|1|test|
|2|test2|

То есть зная зная ID 1 нужно получить из таблицы Categories все подкатегории (ID:1,2,3) и потом получить все записи из таблицы Apps (ID:1,2). Надеюсь смог правильно объяснить этот тривиальный но поставишвший меня в тупик вопрос.
  • Вопрос задан
  • 3168 просмотров
Решения вопроса 1
AmberLEX
@AmberLEX
php/web-developer
Можно так, мысль понятна, думаю, если и я правильно понял вопрос :)
Можно добавить и id родителя, если че.
Ну и методы в моделях, а не как тут :)

c976f5a581724a03bab82df1345a37c8.png9d97e9049f3a47c0afd59503b59ee194.pngdb9bf4e79cab4b60a8b4e7ba1fc9edc0.png
class Model_Category extends ORM
{
	protected $_table_name = 'categories';

	protected $_has_many = array
	(
		'subs' => array(
			'model' => 'Category',
			'foreign_key' => 'parent_id',
		),
		'apps' => array(
			'model' => 'App',
			'through' => 'categories_apps',
			'foreign_key' => 'category_id',
			'far_key' => 'app_id',
		),
	);
}

class Model_App extends ORM
{
	protected $_table_name = 'apps';

	protected $_has_many = array
	(
		'categories' => array(
			'model' => 'Category',
			'through' => 'categories_apps',
			'foreign_key' => 'app_id',
			'far_key' => 'category_id',
		),
	);
}

class Controller_Welcome extends Controller
{
	public function action_index()
	{
		$id = 1;

		// Variant 1
		$subs_ids = $this->get_subs_ids_v1($id);
		$this->show_subs_ids($subs_ids);
		$this->show_apps($subs_ids);

		// Variant 2
		$subs_ids = $this->get_subs_ids_v2($id);
		$this->show_subs_ids($subs_ids);
		$this->show_apps($subs_ids);
	}

	private function get_subs_ids_v1($id)
	{
		// --------
		// Category
		$category = ORM::factory('Category', $id);

		if ( ! $category->loaded())
			throw new HTTP_Exception_404;

		echo 'Category: ' . $category->title . '<br/>';

		// ------------------
		// Sub-Categories ids
		return $category
			->subs
			->find_all()
			->as_array(NULL, 'id');
	}

	private function get_subs_ids_v2($id)
	{
		// ------------------
		// Sub-Categories ids
		return ORM::factory('Category')
			->where('parent_id', '=', $id)
			->find_all()
			->as_array(NULL, 'id');
	}

	private function show_subs_ids($subs_ids)
	{
		echo '<pre>' . print_r($subs_ids, TRUE) . '</pre>';
	}

	private function show_apps($subs_ids)
	{
		// $subs_ids может быть пустым, нужна дополнительная проверка,
		// чтобы where IN не выдало шибку
		$apps = ORM::factory('App')
			->join('categories_apps')
			->on('categories_apps.app_id', '=', 'app.id')
			->where('categories_apps.category_id', 'IN', $subs_ids)
			->find_all();

		foreach ($apps as $app)
			echo 'App: ' . $app->title . '<br/>';
	}
}

Category: cat-1

Array
(
    [0] => 2
    [1] => 3
    [2] => 4
)

App: app-1
App: app-2
App: app-3
App: app-4
App: app-5
App: app-6

Array
(
    [0] => 2
    [1] => 3
    [2] => 4
)

App: app-1
App: app-2
App: app-3
App: app-4
App: app-5
App: app-6
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы