2013-09-09 1 views
0

У меня есть 2 стола, а именно Оборудование и Поставка.как установить отношение с пустым значением?

Я использовал array_merge в Yii PHP, чтобы служить в качестве объединения двух разных таблиц с целью diplaying их в одной сетке.

Все работает нормально с полями, которые являются общими для двух таблиц. Проблема заключается в том, что я пытаюсь отобразить поле, которое существует только в одной из этих двух таблиц. Это говорит недвижимости «Supply.equipType» не определен», потому что только оборудование имеет отношение equipType

в моей GridView:.

array(
    'name'=>'equipment_type', 
    'value'=>'$data->equipType->name', 
    ), 

в мой контроллер, где я сделал слияние:

$prov1 = new CActiveDataProvider('BaseEiEquipItem', array(
      'criteria' => array(
        'condition' => 'id>0' 
        ))); 

    $prov2 = new CActiveDataProvider('BaseSiReceivedItem', array(
      'criteria' => array(
        'condition' => 'id>0' 
        ))); 



    $records=array_merge($prov1->data , $prov2->data); 

    $provAll = new CArrayDataProvider($records, 
      array(
        'sort' => array(//optional and sortring 
          'keyField'=>false, 
          'attributes' => array(
            'id', 'description',), 
        ), 
        'pagination' => array('pageSize' => 10) //optional add a pagination 
      ) 
    ); 

    $this->render('create',array(
      'model'=>$model, 
      'searchModel'=>$searchModel, 
      'modelGrid'=>$modelGrid, 
      'provAll' => $provAll, 
    )); 

в моей модели оборудования:

public function relations() { 
    // NOTE: you may need to adjust the relation name and the related 
    // class name for the relations automatically generated below.  
    return array(
    'equipType' => array(self::BELONGS_TO, 'BaseRefEquipmentType', 'equipment_type'), 

    ); 
} 

Любая идея о том, как это решить? Есть ли способ подделать отношение или что-то еще?

заранее заблаговременно

+0

Я уже поставил свои коды sir @EmilioGort – Enrico

ответ

0

Просто добавьте условие, чтобы проверить, если equipType есть:

'value'=>'isset($data->equipType) ? $data->equipType->name : ""' 

Использование sql для объединения результатов было бы лучше.

+0

Я сделал это вчера ^^ – Enrico

0

Не можете ли вы просто использовать простой союз SQL?

Если оборудование имеет 2 поля (а, б) и питания имеет 2 поля (B, C), вы можете сделать накидные так:

SELECT a, b, null FROM Equipment 
UNION ALL 
SELECT null, b, c FROM Supply 
+0

Можете ли вы предоставить мне полные коды для сетки, модели и контроллера для реализации этого sql? Я ранее сталкивался с проблемами с использованием csqldataprovider, потому что я не могу найти для него полные коды. – Enrico

+0

Ahh., Подумайте об этом, поставщик уже работает sir @leonardys .. Единственная проблема - это отношения, которые я использую для отображения поля в сетке. – Enrico

0

Эта проблема показывает, что это, вероятно, не очень хорошая идея для смешивания разных типов моделей в одном gridview. Если у вас есть модель, которая не имеет equipType, то это довольно очевидно, что вы не можете показать этот столбец в gridview. Итак, что бы вы ожидали?

Как (загрязнен) обхода вы можете добавить все недостающие столбцы как атрибуты псевдо к моделям, где они пропали без вести:

public $equipType;