2016-03-29 4 views
2

Я новичок здесь.Соединительные столы в Yii2

Я прочитал много ответов о соединении столов, но, похоже, не понял его.

Я хочу соединить 2 таблицы я sap_items_slo с большим количеством столбцов: (мне нужно PropertyCode и ИмяСвойства):

id | name | etc.. | PropertyCode | PropertyName 
----------------------------------------------------- 
5 |Product1 | etc.. |  1  | Fill 
75 |Product2 | etc.. |  2  | RTG 
55 |Product3 | etc.. |  2  | Implant 

и другие таблицы propery_hr с колоннами:

PropertyCode | PropertyName 
----------------------------- 
    1  |  Fill2  
    2  |  RTG2  
    3  |  Implant2 

они выглядят так. Я хочу использовать его так, чтобы он переводил имена свойств для некоторых пользователей. Эти таблицы из разных баз данных. я могу назвать первую базу данных и вывод его правильно, но для

userCountry = Yii::$app->user->identity->country; 
if($userCountry == 'SomeCoutnry') { 
    *join tables(display ProperyName for each sap_items_slo PropertyCode from property_hr)* 
    } 

Это мой код SapItemsSearch.php

public function search($params) 
{ 

    $query = SapItems::find()->where(['deleted'=>'no', 'sap_items_slo.country'=>Yii::$app->params['work_country']]); 
    $query->andWhere("ManufacturerCode !=86 and ManufacturerCode !=84 and ManufacturerCode !=83 and ManufacturerCode !=48"); 
    $query->with(['sapPrice','image']); 


    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
     'pagination' => [ 
      'pageSize' => 1000 
     ] 
    ]); 

    $this->load($params); 

    if (!$this->validate()) { 
     // uncomment the following line if you do not want to return any records when validation fails 
     // $query->where('0=1'); 
     return $dataProvider; 
    } 

SapItemsController

public function actionIndex() 
{ 
    $searchModel = new SapItemsSearch(); 
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 

    $js = "$('#imagemodal').on('shown.bs.modal', function (event) { 
     var button = $(event.relatedTarget); 
     var src = button.attr('rel'); 
     var modal = $(this) 
     modal.find('.modal-body').html(\"<div style='text-align:center;'><img src='https://www.dental-medical.rs/upload/product/\"+src+\"' /></div>\"); 
    })"; 

    $this->getView()->registerJs($js); 

    return $this->render('index', [ 
     'searchModel' => $searchModel, 
     'dataProvider' => $dataProvider, 
    ]); 
} 

отобразить его в индекс. php в gridColumns

 $gridColumns = [ 
     [ 
      'attribute' => 'PropertyCode', 
      'label' => 'Property', 
      'value' => 'PropertyName', 
      'filter' => ArrayHelper::map(SapItems::find()->select('PropertyCode,PropertyName')->where('PropertyName<>""')->andWhere(['country'=>Yii::$app->params['work_country']])->distinct()->orderBy('PropertyName')->all(),'PropertyCode','PropertyName'), 
      'filterType'=>GridView::FILTER_SELECT2, 
      'filterWidgetOptions'=>[ 
       'pluginOptions'=>['allowClear'=>true], 
      ], 
      'filterInputOptions'=>['placeholder'=>'-- Property --'], 
     ], 

//And then echo gridView 
     echo GridView::widget([ 
     'rowOptions'=> function ($model, $key, $index, $grid) { 
      if($model->OnHand > 0) 
       return ['class' => 'success']; 
      else 
       return ['class' => 'danger']; 
     }, 
     'dataProvider' => $dataProvider, 
     'filterModel' => $searchModel, 
     'columns' => $gridColumns, 
     'pjax' => false, 
     'layout' => '<div style="margin-bottom:10px;"><h2 style="font-size:25px;" class="panel-title pull-left"><i class="glyphicon glyphicon-user"></i> '.$this->title.'</h2><div class="pull-right">{toolbar}</div><div class="clearfix"></div></div>{items}<div class="pull-left" style="margin-top:-20px;">{pager}</div><div class="pull-right">{summary}</div><div class="clearfix"></div>', 

Надеюсь, этого достаточно информации, мне дан этот проект в Yii2, и я не уверен, как это сделать. Я пробовал несколько способов, но без везения. Я ценю любую помощь! если вы хотите, чтобы я опубликовал любую другую информацию, заполните ее бесплатно.

ответ

1

Для соединения использовать ADN две таблицы в GridView с фильтром вам нужно этот STED

в вашей SapItems модели вам необходима публичная функция для связи

я предполагаю таблицу propery_hr есть класс модели под названием Property

public function getProperty() 
{ 
    return $this->hasOne(Property::className(), 
    ['PropertyCode' => 'PropertyCode']); 
} 

Тогда вы можете построить поглотитель для PropertyName

public function getPropertyName() { 
    return $this->property->PropertyName; 
} 

то в вашем GridView вы можете использовать ИмениСвойства

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'summaryOptions' => ['class' =>'dfenx_pagination_summary',], 
    'pager' => ['options' => ['class'=> 'pagination pull-right']], 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'], 
     ..... 
     'PropertyName', 
     .....  

для поиска и фильтрации вы должны добавить в ваш seachModel общественный вар для фильтра ..

public $PropertyName; 

И определить этот вар безопасный для поиска

public function rules() 
{ 
    return [ 
     ... 
     [[ 'PropertyName', ], 'safe'], 

    ]; 
} 

в SapItemsSearch вы должны добавить joinwith вам отношение

 if (!($this->load($params) && $this->validate())) { 
     $query->joinWith(['Property']); 

     return $dataProvider; 
    } 

в этот момент вы можете получить данные в вас modelSearch с

->andFilterWhere(['like','PropertyName', $this->PropertyName]) 

Вы можете найти полезную обучающую программу для проблемы yuor в этом документе http://www.yiiframework.com/wiki/621/filter-sort-by-calculated-related-fields-in-gridview-yii-2-0/

+0

Как альтернатива созданию геттера для 'PropertyName', вы также можете использовать точечные отношения Yii и просто поместить' property.PropertyName' в массив столбцов , Это потребует некоторых изменений в поиске, но это избавит вас от написания дополнительного кода, если вам нужно это делать часто. – spencer4of6

+0

Я проверю это сегодня и дам вам знать, как это происходит. Большое спасибо! :) –

Смежные вопросы