Laravel 4 и красноречивый запрос

У меня 4 стола:

партнеры пользователи телефоны адреса

После того, как пользователь вошел в систему, я хочу быть уверенным, что в запросе возвращаются только записи, связанные с его (id).

Итак, когда я запрашиваю партнера, я хочу вернуть не только данные для соответствия партнера (id), но также убедиться, что пользователи (id) соответствуют fk (user_id) в партнерах.

Теперь, для еще одного уровня сложности, я хотел бы знать, могу ли я запросить партнера (соответствующий id и user_id), а также получить их основной телефон и основной адрес из соответствующих таблиц телефонов и адресов. Итак, возможно ли это, используя красноречие и структуру таблицы, которую я изложил ниже?

контроллер партнеров (PartnersController.php)

public function show($id)
{

    $data = Partners::find($id)->where('user_id', Auth::user()->id)->first();
    $phone = Partners::find(1)->phone;
    //var_dump($phone);
    return View::make('partners.showone')
            ->with('data', $data)
            ->with('phone', $phone)
            ->with('title', "$data->firstName $data->lastName")
            ->with('breadcrumb', "$data->firstName $data->lastName");
}

в идеале я хотел бы просто вытащить одну запись в таблице телефонов, которая соответствует этому значению primaryPhone из массива $ data. Возможно ли это при одновременном обеспечении соответствия user_id user () -> id?

вид (showone.blade.php)

Как мне представить эти данные в представлении? Если телефоны представляют собой массив (как это было бы выше), я предполагаю, что следующее будет работать

                @foreach($phone as $ph)
                <option value="{{ $ph->id }}" 
        @if($ph->id == $data->primaryPhone) {{ "selected" }} 
        @endif
        > {{ $ph->number }} - {{ $ph->description }}</option>
                @endforeach

Модель партнеров (Partners.php)

public function phone()
{
   return $this->hasMany('Phone', 'partner_id')->where('user_id', Auth::user()->id);
}

public function primaryPhone($id)
{
   return $this->has('Phone', 'id')->where('user_id', Auth::user()->id);
}

СТРУКТУРЫ ТАБЛИЦ

        CREATE TABLE `partners` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `user_id` int(11) NOT NULL,
        `firstName` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `lastName` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `spouseName` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `primaryPhone` int(11) NOT NULL,
        `primaryAddress` int(11) NOT NULL,
        `primaryEmail` int(11) NOT NULL,
        `greeting` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `birthDate` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `spouseBirthDate` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `anniversary` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `notes` text COLLATE utf8_unicode_ci NOT NULL,
        `profession` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `spouseProfession` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `pNewsletter` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `eNewsletter` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `partnerStatus` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `photoUrl` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        PRIMARY KEY (`id`),
        UNIQUE KEY `partners_id_unique` (`id`)
      ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

      CREATE TABLE `phones` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `partner_id` int(11) NOT NULL,
        `user_id` int(11) NOT NULL,
        `number` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `description` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        PRIMARY KEY (`id`),
        UNIQUE KEY `phones_id_unique` (`id`)
      ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

      CREATE TABLE `addresses` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `partner_id` int(11) NOT NULL,
        `user_id` int(11) NOT NULL,
        `city` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `state` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `country` int(11) NOT NULL,
        `postalcode` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `address_1` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `address_2` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `description` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        PRIMARY KEY (`id`),
        UNIQUE KEY `addresses_id_unique` (`id`)
      ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

      CREATE TABLE `users` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `firstName` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `lastName` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `phoneNumber` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
        `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
        PRIMARY KEY (`id`),
        UNIQUE KEY `users_id_unique` (`id`),
        UNIQUE KEY `users_email_unique` (`email`)
      ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

person Michael    schedule 22.06.2013    source источник


Ответы (1)


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

О том, можно ли загрузить только строку телефона, которая соответствует строке в основной таблице: ДА ... но вы установили отношения в моделях? Вставьте свою модель сюда

person Israel Ortuño    schedule 22.06.2013
comment
Я последовал твоему совету и сейчас использую функцию list (). Эта часть отлично работает. - person Michael; 22.06.2013
comment
Теперь, есть ли способ выбрать только номер телефона, соответствующий fk primaryPhone? и есть ли это в массиве партнеров (вместо целого числа fk)? - person Michael; 22.06.2013
comment
Не тестировал, но пробовали ли вы сделать что-то вроде $phones = Partners::find(1)->phone->lists('phone', 'id'); - person Israel Ortuño; 22.06.2013