Одна и та же ассоциация модели таблицы дважды в cakephp 3.2

Я сделал ассоциацию моделей в торте 3.2.

Здесь я сделал это для одного идентификатора той же таблицы.

Я пытался сделать это для другого, но он не работает вообще

ниже поток.

Этот вывод я получаю

{
   "id": 1,
   "publisher_id": 133,
   "user_id": 118,
   "Publisher": {
       "id": 133,
        "name": "Sradha sradha"
    }

Здесь я также хочу связать идентификатор пользователя, который принадлежит той же пользовательской таблице.

Вывод должен быть таким (я хочу получить вот так ниже)

 {
     "id": 1,
     "publisher_id": 133,
     "user_id": 118,
     "Publisher": {
          "id": 133,
          "name": "Sradha sradha"
     }
     "Users": {
         "id": 118,
         "name": "Sradha anjo"
     }

Здесь и publisher_id, и user_id принадлежат одной пользовательской таблице.

$this->AdminRevenues->belongsTo('Users', [ 
    'className' => 'Users', 
    'foreignKey' => 'user_id', 
    'propertyName' => 'Users']);

$this->AdminRevenues->belongsTo('Users', [ 
   'className' => 'Publisher', 
   'foreignKey' => 'publisher_id', 
   'propertyName' => 'Publisher']);

$totalAdminRevenue = $this->AdminRevenues->find('all')
->contain([
     'Users' => ['queryBuilder' => function ($q) {
    return $q->select(['id', 'name']);
 }]])
 ->toArray();

Пожалуйста, предложите, любое предложение будет высоко оценено.


person sradha    schedule 23.06.2016    source источник
comment
вы просто перепутали название отношения с названием таблицы. belongsTo('Publisher', [ 'className' => 'Users',. То же самое в запросе.   -  person arilia    schedule 23.06.2016


Ответы (3)


Псевдонимы должны быть уникальными

Что это делает:

$this->AdminRevenues->belongsTo('Users', [ 
    'className' => 'Users', 
    'foreignKey' => 'user_id', 
    'propertyName' => 'Users']);

$this->AdminRevenues->belongsTo('Users', [ 
   'className' => 'Publisher', 
   'foreignKey' => 'publisher_id', 
   'propertyName' => 'Publisher']);

Объявляет ассоциацию, используя AdminRevenues.user_id, а затем сразу перезаписывает ассоциацию AdminRevenues.publisher_id. По сути, первый вызов belongsTo ничего не делает.

Псевдонимы ассоциации должны быть уникальными, иначе такой код, как $foo = $this->AdminRevenues->Users, будет неоднозначным. Итак, просто сделайте псевдонимы ассоциаций уникальными:

$this->AdminRevenues->belongsTo('Users', [ 
    'className' => 'Users', 
    'foreignKey' => 'user_id', 
    'propertyName' => 'Users']);

$this->AdminRevenues->belongsTo('Publishers', [ // <--- 
   'className' => 'Users',                      // <---
   'foreignKey' => 'publisher_id', 
   'propertyName' => 'Publisher']);
person AD7six    schedule 23.06.2016
comment
из того, что говорит ОП, кажется, что и пользователи, и издатели относятся к одному и тому же объекту таблицы, поэтому я думаю, что в обоих случаях должно быть 'className' => 'Users' - person arilia; 23.06.2016
comment
здесь пользователь такой же, как зритель, а издатель отличается. я имею в виду, что user_id (просмотрщик) и publisher_id принадлежат одной родительской таблице Users. Поскольку он принадлежит одной таблице, я получаю только один идентификатор из двух. Мне нужно, чтобы оба пришли в бинд. - person sradha; 24.06.2016
comment
@AD7six AD7six Здесь модель издателя отсутствует :( :( - person sradha; 24.06.2016
comment
Это правильно, вам просто нужно добавить издателей в свой контент в дополнение к пользователям. - person Jun; 24.06.2016

У меня работает в cakephp 3+

Предположим, у вас есть две таблицы, т.е.
1) RequestArticles 3) Store

У нас есть две похожие модели: -

1) RequestArticlesTable 2) StoreTable

Вот ассоциация, которую вам нужно определить в RequestArticlesTable, мы дважды присоединяемся к таблице Store.

  public function initialize(array $config)
{
    parent::initialize($config);

    $this->table('request_articles');
    $this->displayField('id');
    $this->primaryKey('id');


    $this->belongsTo( 'yourstore', [
        'foreignKey' => 'store_id',
        'className' => 'Store'
    ]);

    $this->belongsTo( 'fromstore', [
        'foreignKey' => 'from_store_id',
        'className' => 'Store'
    ]);     
}

Теперь мы соединим таблицы в контроллере, как показано ниже, и установим данные для просмотра:

// query to fetch the data from RequestArticles table and set join for store table twice
$requestArticlesDetaile = $this->RequestArticles->get($id, [
    'contain' => ['yourstore','fromstore']
]);
// set fetched data to view 
$this->set('requestArticlesDetaile', $requestArticlesDetaile);
person kantsverma    schedule 09.03.2017
comment
Отличный ответ с примером тоже. - person Hasnat Safder; 13.05.2020

Мое решение, вызовите его в контроллере в содержимом

$this->belongsTo('Senders', [
    'foreignKey' => 'sender_id',
    'joinType' => 'LEFT',
    'className' => 'Manager.Users'
]);

$this->belongsTo('Receivers', [
    'foreignKey' => 'receiver_id',
    'joinType' => 'LEFT',
    'className' => 'Manager.Users'
]);
person gabrielkolbe    schedule 14.11.2018