Задать вопрос
Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (6)

Лучшие ответы пользователя

Все ответы (11)
  • Как перенять объектно-ориентированное мышление?

    AmberLEX
    @AmberLEX
    php/web-developer
    Дмитрий Елисеев
    www.elisdn.ru/oop-week
    Очень расжевывает и доступно объясняет.
    Есть много бесплатных видео, чтоб понять уровень.
    Это не очередной говно-курс как срубить бабок на перессказе документации.
    Посмотрите посты в блоге. Я правда курсы не проходил, но видео-материалы смотрел.
    Ответ написан
    Комментировать
  • Kohana ORM связь has_many и подкатегории правильное отображение?

    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
    Ответ написан
    Комментировать