Нужна помощь в Laravel Eloquent для множественного присоединения - PullRequest
0 голосов
/ 04 апреля 2020

у меня 3 таблицы. Events, Events_join, Customers. в event_join у меня есть только идентификаторы клиентов, которые присоединяются к событию. в настоящее время я выбираю события с массивом events_join, используя эту структуру моей БД:
Структура таблицы для таблицы my_events

CREATE TABLE IF NOT EXISTS `my_events` (
  `id` int(10) unsigned NOT NULL,
  `userid` int(11) NOT NULL,
  `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `sdes` varchar(256) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `pic` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '1',
  `sdate` date NOT NULL DEFAULT '1970-01-01',
  `edate` date NOT NULL DEFAULT '1970-01-01',
  `country` int(11) NOT NULL,
  `city` int(11) NOT NULL,
  `location` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
  `url` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
  `des` varchar(10000) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `cat` int(10) unsigned NOT NULL DEFAULT '1',
  `deleted_at` timestamp NULL DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  `timezone` varchar(90) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Структура таблицы для таблица customers

CREATE TABLE IF NOT EXISTS `customers` (
  `id` int(10) unsigned NOT NULL,
  `title` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
  `firstname` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `lastname` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `username` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `phone` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
  `country` int(10) unsigned NOT NULL DEFAULT '1',
  `city` int(10) DEFAULT NULL,
  `company` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `pic` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `level` int(10) unsigned NOT NULL DEFAULT '1',
  `status` tinyint(4) NOT NULL DEFAULT '1',
  `deleted_at` timestamp NULL DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Структура таблицы для таблицы events_join

CREATE TABLE IF NOT EXISTS `events_join` (
  `id` int(11) NOT NULL,
  `userid` int(11) NOT NULL,
  `eventid` int(11) NOT NULL,
  `sdate` date NOT NULL,
  `edate` date NOT NULL,
  `date` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

В модели «Мои события» есть это

public function customers()
{
    return $this->belongsToMany(Events::class,EventsJoin::class);
}

У модели "Мой клиент" есть этот

public function events()
{
    return $this->belongsToMany(Customer::class,EventsJoin::class);
}

Мои события. У этого элемента есть этот сводный элемент

 public function customer()
{
    return $this->belongsTo(Customer::class);
}

public function event()
{
    return $this->belongsTo(Events::class);
}

. У моего eventControler есть этот

$events=Customer::with(['event']);

, но возвращаемая пустая запись. способ, которым его работа - клиенты, могут создать события, и другие клиенты присоединятся к событию. в настоящее время те присоединяются к событиям, сохраняя с ИД пользователя в таблице events_join. Я хочу объединить таблицу events_join с таблицей customers, чтобы получить дополнительную информацию о клиенте.

1 Ответ

0 голосов
/ 04 апреля 2020

Хотя это и не упоминается в вашем коде, я должен был бы предположить, что у вас есть 3 Модели, одно Событие, другое для EventsJoin и одно для Клиентов.

То, что у вас есть, хотя вы этого не делаете скажем так, это отношение «многие ко многим», в котором клиент может участвовать в нескольких событиях, а к событию могут присоединиться несколько клиентов.

В Laravel красноречивых терминах отношение «многие для многих» описывается с помощью belongsToMany . Посмотрите документацию: https://laravel.com/docs/master/eloquent-relationships#many-ко-многим

Поскольку это отношение «многие ко многим», EventsJoin необходимо расширить Pivot а не Модель .

То есть у вас будет Клиент Модель, например:

public function events()
{
 return $this->belongsToMany(Customer::class,EventsJoin::class);
}

И в вашем EventsJoin Сводная модель

public function customer()
{
    return $this->belongsTo(Customer::class);
}

public function event()
{
    return $this->belongsTo(Event::class);
}

А в ваших Событиях Модель

public function customers()
{
return $this->belongsToMany(Event::class,EventsJoin::class);
}

Когда вы sh получите массив объектов событий, вы будет делать $ customer-> events ; И когда вы наберете sh, чтобы получить массив клиентов из этого события, вы будете делать $ event-> Customers ;

Обратите внимание, что множественные и единичные падежи важны для Laravel Красноречивый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...