@romkaby

Yii2 / Active Record / Как получить поля из Join таблицы?

Собственно, код:
$data = Media::find()
            ->select( ['media.*', 'content.*'] )
            ->leftJoin('content','`content`.`id` = `media`.`parent_id`')
            ->orderBy(['`media`.`id`' => SORT_DESC])->all();

Сама модель Media наследована от ActiveRecord
В результате каждый элемент состоит из полей таблицы media, а данных таблицы content, которая джойнится - нету.
Посдкажите как из выковырять эти поля?
  • Вопрос задан
  • 1043 просмотра
Решения вопроса 1
vikoff
@vikoff
Web-разработчик
Я для этого использовал кастомный behaviour. Решение не самое красивое, но лучше ничего не придумалось. Этот behaviour позволяет модели иметь совершенно произвольные свойства.

класс кастомного Behaviour
namespace app\custom\behaviors;

use yii\base\Behavior;

class ExtraPropsBehaviour extends Behavior
{
	protected $_props = [];

	public function canGetProperty($name, $checkVars = true)
	{
		return TRUE;
	}

	public function canSetProperty($name, $checkVars = true)
	{
		return TRUE;
	}

	public function __get($name)
	{
		return isset($this->_props[$name]) ? $this->_props[$name] : null;
	}

	public function __set($name, $value)
	{
		$this->_props[$name] = $value;
	}

	public function __isset($name)
	{
		return isset($this->_props);
	}

}


а это добавить в модель
/** @inheritdoc */
	public function behaviors()
	{
		return [
			ExtraPropsBehaviour::className()
		];
	}


После применения можно обращаться к результатам сджойненной таблицы как к простым свойствам модели:
$model->field_from_joined_table
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@drdios
немного упрощенный способ по мотивам Юрий Новиков
я добавил просто в класс модели этот код:

/**
     * блок для подсоединения полей от left join
     */
    public $join_vars = [];
    public function canSetProperty($name, $checkVars = true, $checkBehaviors = true)
    {
        return TRUE;
    }
    public function __set($name, $value)
    {
        if($this->hasAttribute($name))
            parent::__set($name, $value);
       else
           $this->join_vars[$name] = $value;
    }


Потом доступ к данным через $model->join_vars['name']
Записывать поля можно и как свойства и даже как атрибуты, но возможна неверная их трактовка. Поэтому лучше складывать отдельно в какой-то массив
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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