Доступ ко многим отношениям с Laravel - PullRequest
0 голосов
/ 10 мая 2018

Итак, проблема, с которой я сталкиваюсь, связана с доступом и использованием данных из множества отношений. Я использую Laravel в октябре cms.

У меня есть объекты Owners и ManyToMany с pivot table с использованием owner_id and manytomany_id,Я могу получить доступ к OneToMany relationship просто отлично, используя приведенный ниже код, но пытаясь получить доступ к ManyToMany objects Я не могу назначить их, это код, который я использую,

    foreach ($this->owners as $owner) {
        $owner['onetomany'] = $owner->onetomany()->take($this->maxJobs)->get();
        $owner['manytomany'] = $owner->manytomany()->take($this->maxTeam)->get();    
    }

мои отношения определены так

public $belongsToMany = [
    'manytomany' => [
        'Kai\Relations\Models\ManyToMany', 
        'table' => 'kai_relations_owner_many_to_many'
    ]
];
public $belongsToMany = [
    'owner' => [
        'Kai\Relations\Models\Owner', 
        'table' => 'kai_relations_owner_many_to_many'
    ]
];

, если я определю переменную страницы, такую ​​как $this->something, это не позволит мне присвоить результаты запроса ManyToMany, но если я назначу результаты только $ что-то, я могу Записатьрезультаты и посмотреть возвращенные данные, так почему я не могу получить к ним доступ?

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

Это ошибка, которую я получаю:

SQLSTATE[HY000]: General error: 2031 (SQL: select * from `kai_relations_many_to_manies` where `id` in (?))

Если кто-то может пролить свет на это, это очень поможет!

Ответы [ 2 ]

0 голосов
/ 10 мая 2018
foreach ($this->owners as $owner) {
        $owner['onetomany'] = $owner->onetomany()->take($this->maxJobs)->get();
        $owner['manytomany'] = $owner->manytomany()->take($this->maxTeam)->get();    
    }

Я думаю, что это не работает, потому что вы уже определили отношения с именем manytomany Поэтому он попытается переопределить ваши многие данными, которые вы пытаетесь получить.с помощью $owner->manytomany()->take($this->maxTeam)->get();

Теперь вы можете изменить имя с $owner['manytomany'] на имя, отличное от вашего отношения, например $owner['ownerManyToMany'], и тогда вы можете получить свои данные.

Попробуйте это

foreach ($this->owners as $owner) {
        $owner['onetomany'] = $owner->onetomany()->take($this->maxJobs)->get();
        $owner['ownerManyToMany'] = $owner->manytomany()->take($this->maxTeam)->get();    
    }
0 голосов
/ 10 мая 2018

В документе: https://laravel.com/docs/5.3/eloquent-relationships#many-to-many говорят, что отношение имеет сводную таблицу, и в этой таблице есть столбцы со ссылкой на таблицу для создания множества отношений.

например, для файла миграции:

Schema::create('category_product', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('category_id');
    $table->integer('product_id');
});;

В модели товара:

public function extraCategories()
{
    return $this->belongsToMany(Category::class);
}

В категории Модель:

public function extraProducts()
{
    return $this->belongsToMany('App\Product');
}

Другие примеры на модели:

public function associacion()
{
    return $this->belongsToMany('App\Product', 'product_related', 'product2_id', 'product_id');
}

В этом случае имеется определенная таблица, первый столбец и второй столбец, которые Eloquent не устанавливает автоматически с помощью сводной таблицы и другой модели.

Когда вы получаете данные, например, с тинкером, вы видите:

App\Product {#892
     id: "4555",
     name: "PRODUCT NAME",
     extraCategories: Illuminate\Database\Eloquent\Collection {#912
       all: [
         App\Category {#907
           id: "245",
           description: "YYYYY",
           pivot: Illuminate\Database\Eloquent\Relations\Pivot {#902
             product_id: "4555",
             category_id: "245",
           },
         },
         App\Category {#908
           id: "135",
           description: "XXXXX",
           pivot: Illuminate\Database\Eloquent\Relations\Pivot {#901
             product_id: "4555",
             category_id: "135",
           },
         },
       ],
     },
   }

В этом случае возвращаемое отношение extraCategories многие ко многим в массиве коллекций.

Я надеюсь, что это решило ваши проблемы.

...