Yii2 Вывести набор данных по набору id
проблема такая:
Есть 2 таблицы
таблица - company['id','name','contract_id']
таблица - contract['id', 'name']
К компаниям нужно привязать несколько договоров из таблицы contract
Это реализовано, договора привязываются, в базе это выглядит так:
в поле contract_id(varchar) в таблице company хранятся id'шники 13,28,43....
Вот как это реализовано:
action в companyController
public function actionCreate()
{
$model = new Company();
if ($model->load(Yii::$app->request->post())) {
$model->contract_id = implode(',', $model->contract_id);
if($model->save()){
return $this->redirect(['view', 'id' => $model->id]);
}
}
return $this->render('create', [
'model' => $model,
]);
}
Модель Company
public function getContractList()
{
$contractList = Contract::find()->select('id, name')->all();
$list = ArrayHelper::map( $contractList, 'id', 'name');
return $list;
}
Форма create
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name')->textarea(['rows' => 6]) ?>
<?= $form->field($model, 'address')->textInput(['id' => 'address4','maxlength' => true]) ?>
<?= $form->field($model, 'info')->textarea(['rows' => 6]) ?>
<div class="row">
<div class="col-md-8">
<?= $form->field($model, 'contract_id[]')->dropDownList($model->ContractList, ['multiple' => 'multiple'] ); ?>
</div>
<div class="col-md-4">
<a href="/admin/contract" class="btn btn-outline-warning" style="margin-top: 28px; display: inline-block">Редактировать договора</a>
</div>
</div>
<div class="form-group">
<?= Html::submitButton('Сохранить', ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
Суть проблемы: Не знаю как теперь преобразовать строку с id'шниками из поля contract_id в договора и вывести их в GridView
Ответы (1 шт):
Надо же наоборот в таблицу contract добавить поле company_id и туда прописывать id компании. Таким образом контракт будет привязан к компании. Далее уже стандартными реляциями работать с контрактами компании.
class Company extends ActiveRecord
{
public function getContracts()
{
return $this->hasMany(Contract::class, ['company_id' => 'id']);
}
}
class Contract extends ActiveRecord
{
public function getCompany()
{
return $this->hasOne(Company::class, ['id' => 'company_id']);
}
}
И се. Каждый контракт может получить данные компании, а каждая компания может получить данные всех контрактов.
Читать отсюда и дальше вниз. Там про связывание, получение данных, сохранение через метод link() и все прочее. https://www.yiiframework.com/doc/guide/2.0/ru/db-active-record#relational-data