Создайте пользовательский список полей ввода с полем отображения из связанной модели в cakephp 3

У меня три стола campaign_social_accounts, social_accounts, а также social_networks

SocialNetworks содержит сети, к которым пользователь может подключиться с помощью столбцов

+-----+--------+
| id  | title  |
+-----+--------+

SocialAccounts имеет все учетные записи, к которым пользователь подключен со столбцами как

+----+---------+-------------------+--------------+----------+
| id | user_id | social_network_id | access_token | user_key |
+----+---------+-------------------+--------------+----------+

CampaignSocialAccounts имеет ассоциацию Campaigns и добавил социальные аккаунты в эту кампанию

+-----+-------------+-------------------+
| id  | campaign_id | social_account_id |
+-----+-------------+-------------------+

В add() из CampaignSocialAccounts Я хочу, чтобы пользователь выбирал из SocialAccounts для этого это то, что я сделал в контроллере

$socialAccounts = $this->CampaignSocialAccounts->SocialAccounts->find('list', [
   'conditions' => [
       'user_id' => $this->Auth->user('id')
   ]
]);

а также add.ctp

echo $this->Form->control('social_account_id', ['options' => $socialAccounts]);

Вопрос

Это показывает id в списке, так как в этом поле нет другого столбца, который можно установить на displayField()

Кроме того, я хочу отобразить список как

Facebook(112233445566)
Youtube(2233112233)

куда Facebook а также Youtube название от SocialNetworks стол и (112233....) является user_key от SocialAccounts и значение сгенерированной опции будет id из SocialAccounts

<option value="1<id from social_accounts>">Facebook(112233445566)</option>
<option value="2<id from social_accounts>">Youtube(2233112233)</option>

Возможно ли, если да, какой самый лучший и простой подход для этого.

Редактировать 2: Моя попытка

В действии контроллера

$socialAccounts = $this->CampaignSocialAccounts->SocialAccounts
    ->find('list', ['valueKey' => 'social_account_title'])
    ->contain(['SocialNetworks'])
    ->where(['user_id' => $this->Auth->user('id')]);

SocialAccount.php сущность

public function _getSocialAccountTitle()
{
    if (isset($this->social_network)) {
        return $this->social_network->title.' ('.$this->user_key.')';
    }
    return $this->id;
}

Все еще никакого эффекта

1 ответ

Решение

В вашем SocialAccounts Сущность вы можете определить виртуальную собственность

public function _getFullName()
{
    if(isset($this->social_network))
        return $this->social_network->name.' ('.$this->user_key.')';
    return $this->id;
}

тогда вы можете использовать ваше новое виртуальное свойство в вызове find()

в вашем контроллере

$socialAccounts = $this->CampaignSocialAccounts->SocialAccounts
    ->find('list', ['valueField' => 'full_name'])
    ->contain(['SocialNetworks'])
    ->where(['user_id' => $this->Auth->user('id')]);
Другие вопросы по тегам