Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 08.12.2012 01:19:05

Eloquent-связи

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

user: id, name, id_city, id_country
city: id, name
country: id, name

Подскажите как связать модели что бы вывести пользователей? :
name (user)
name (city)
name (country)

Не в сети

#2 08.12.2012 11:19:30

Re: Eloquent-связи

PHP
class User extends Eloquent {
  function 
city() { return $this->has_one('City''id_city'); }
}

class 
City extends Eloquent {
  function 
user() { return $this->belongs_to('User''id_city'); }
}

Аналогично с country. См. статью.

Не в сети

#3 08.12.2012 23:11:25

Re: Eloquent-связи

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

Не в сети

#4 08.12.2012 23:53:54

Re: Eloquent-связи

Решил на 50% вот модель User:

PHP
class User extends Eloquent{
     public function 
city()
     {
          return 
$this->belongs_to('City','id_city');
     }
     public function 
country()
     {
          return 
$this->belongs_to('Country','id_country');
     }
}

Вывожу и получаю всех пользователей с городами, но как еще к ним прилепить страну не знаю:

PHP
$users User::with('city')->get();
print_r($users);

Думал как-то так:
$users = User::with(’city’,’сountry’)->get();

или так:
$users = User::with(’city’)->with(’сountry’)->get();

но безрезультатно.

Изменено Dem (08.12.2012 23:56:13)

Не в сети

#5 09.12.2012 10:46:15

Re: Eloquent-связи

Мне кажется ты неправильно сформулировал вопрос, так как не получится «правильно реализовать связи», чтобы получить то, что ты хочешь. Если твоя цель — получить за один запрос данные из нескольких полей, то связи здесь не помогут — поможет JOIN:

PHP
class User extends Eloquent { }

User
  
::join('country''id_country''=''country.id')
  ->
join('city''id_city''=''city.id')
  ->
get();

В любое место перед PHPget() можешь добвить условия (PHP->where()), группировку, сортировку или вызовы любх других методов PHPQuery.

Не в сети

#6 09.12.2012 15:19:24

Re: Eloquent-связи

спасибо, ну с джойном понятно )) я думал может как то через связи, за 3 запроса, выбор всех данных из 3х таблиц и потом связать их по значениям. Ну с джойном проще все за 1 запрос.

Не в сети

#7 09.12.2012 18:54:23

Re: Eloquent-связи

  1. как то через связи, за 3 запроса, выбор всех данных из 3х таблиц и потом связать их по значениям

Можно сделать просто 3 запроса с WHERE, но зачем? JOIN их свяжет сам, да и запрос один.

Не в сети

#8 09.12.2012 22:34:48

Re: Eloquent-связи

и вот уже по join есть вопрос, он выводит данные, все ок. ток как быть если одинаковые название столбцов user.name, city.name, country.name, он выводит по последним... Есть какой-то AS или что-то подобное? или как решается такая задача?

Не в сети

#9 10.12.2012 13:17:36

Re: Eloquent-связи

AS можно задать для отдельный полей, для целой таблицы алиас задать нельзя, поэтому кроме как перечислением users.id as user_id, city.name as city_name, ... ничего не сделать.

Как вариант — для таблиц с самым большим числом полей не делать алиасы, а для прочих сделать:

SELECT users.*, city.name as city_name, country.name as country_name

Не в сети

#10 10.12.2012 16:11:03

Cheshirrski
masterМастер
Откуда: Днепр
Сообщений: 116
Статей: 2

Re: Eloquent-связи

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

Изменено Cheshirrski (10.12.2012 16:16:03)

Не в сети

#11 11.12.2012 11:51:15

Re: Eloquent-связи

Насколько я помню для создания VIEW нужны особые права для пользователя БД, так что просто так они могут и не заработать. Да и использовать их имеет смысл только в очень уж замороченных запросах, ИМХО.

Не в сети

#12 11.12.2012 12:50:12

Re: Eloquent-связи

Всем спасибо, разобрались )) остаемся на join’e.

Есть другой вопрос (в эту тему или новую создавать?):

Вот action из User_Controller, все работает.

1. Как выдать 404 если нет пользователя в базе, сейчас у меня «Trying to get property of non-object»
2. в правильном ли направлении я иду?

PHP
    public function action_profile($id  null)
    {
        if (
$id)
        {
            
$user User::find($id);
            
$this->layout->nest('page''user.profile', array('title' => 'Профиль''user' => $user));
        } else {
            return 
Redirect::to('user/list');
        }
    }

Изменено Dem (11.12.2012 12:50:48)

Не в сети

#13 11.12.2012 12:55:16

Re: Eloquent-связи

  1. Есть другой вопрос (в эту тему или новую создавать?):

Лучше в отдельную, но похожая тема уже была.

Направление правильное, но не понятно, в чём у тебя собственно проблема. User::find() возвращает или модель, или null, если такого ID нет. Что тебе мешает проверить $user == null и вернуть другую страницу, если это так?

Сейчас у тебя, очевидно, 'user' используется в шаблоне в стиле $user->login и конечно PHP ругается, что $user — не объект.

Не в сети

#14 11.12.2012 15:26:59

Re: Eloquent-связи

ясно, спасибо, то есть выход только такой?

PHP
    public function action_profile($id  null)
    {
        if (
$id)
        {
            
$user User::find($id);
            if (
$user == null) { return Redirect::to('user/list'); }
            
$this->layout->nest('page''user.profile', array('title' => 'Профиль''user' => $user));
        } else {
            return 
Redirect::to('user/list');
        }
    }

Не в сети

#15 11.12.2012 15:58:55

Re: Eloquent-связи

  1. ясно, спасибо, то есть выход только такой?

Ну, гм, проверить результат функции можно через if, да. Не пойму, что тебя тут сбивает с толку? Можешь вместо редиректа другой шаблон возвращать. Или внутри шаблона можешь написать что-то вроде этого:

xml@if ($user == null)
  <p>Нет такого пользователя!</p>
@endif

Не в сети

#16 11.12.2012 16:23:04

Re: Eloquent-связи

С толку не сбивает, рассматриваю альтернативы…

Так не пойдет:

PHP
@if $user == null
  
<p>Нет такого пользователя!</p>
@endif

ругается что не объект сам контроллер, надо тогда давать что-то в вид что б не пусто было.

Спасибо за помощь.

Не в сети

#17 11.12.2012 16:34:34

Re: Eloquent-связи

  1. @if $user == null

Я про скобки забыл внутри @if. Ты а Blade разве не пишешь? Если нет, вот обычный PHP:

PHP
<?php if ($user == null) {?>
  <p>Нет такого пользователя!</p>
<?php }?>

В общем, идею ты понял.

Не в сети

#18 11.12.2012 16:48:31

Re: Eloquent-связи

я в blade, о пока ты тут, чет не пойму чего не работает авторизация:

PHP
$userdata = array(
                
'username' => 'admin',
                
'password' => '123'
            
);
            if (
Auth::attempt($userdata)) {
                
#return Redirect::to_route('home');
                
return 'ok';
            } else {
                return 
'error';
            }

Вот в базе оно:

CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(100) DEFAULT NULL,
`email` varchar(100) NOT NULL DEFAULT ’’,
`password` varchar(100) DEFAULT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
INSERT INTO `users` VALUES (1,’admin’,’admin@test.com’,’$2a$08$VXhyM0k5c0d3QTJhTXZoWe1iXtrQQk65Xp/SO/hex5WReSkTXVWQ6’,’2012-12-10 11:12:13’,’2012-12-10 11:12:13’);

Выдает всегда error, если просто сделать echo Auth::attempt($userdata) выдает null

На первый взгляд тут дело секунду, но вот цитата из мануала:

PHP
$credentials = array('username' => 'example@gmail.com''password' => 'secret');

if (
Auth::attempt($credentials))
{
     return 
Redirect::to('user/profile');
}

неня убила наповал вот эта штука, название имя а стоит мыло:
’username’ ⇒ ’example@gmail.com’

и непонятно, совать сюда хеш пароля 123 или сам пароль 123
’password’ ⇒ ’secret’

пробывал комбинации и имя и пароль, имя и хеш, мыло...

Изменено Dem (11.12.2012 17:02:10)

Не в сети

#19 11.12.2012 17:30:54

Re: Eloquent-связи

Решено!
Пароль неверный был.
Вводить надо так: $credentials = array(’username’ ⇒ ’admin@test.com’, ’password’ ⇒ ’123’);

но все равно меня убила наповал вот эта штука, название имя а стоит мыло:
’username’ ⇒ ’example@gmail.com’

Не в сети

#20 11.12.2012 17:42:06

Re: Eloquent-связи

Нда, близость форума действует расслабляюще ☺

То, что в «username» у тебя почта — это не заслуга Laravel, а твоя собственная. Драйвер авторизации просто проверяет данные по таблице, он не умеет регистрировать новых людей — поэтому это делаешь ты где-то в своём приложении. И при регистрации устанавливаешь username в почту. Вот и всё.

Не в сети

#21 11.12.2012 18:32:13

Re: Eloquent-связи

ясно спасибо ))

Не в сети

Подвал раздела