Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Подскажите как правильно реализовать связи, есть таблицы (модели):
user: id, name, id_city, id_country
city: id, name
country: id, name
Подскажите как связать модели что бы вывести пользователей? :
name (user)
name (city)
name (country)
Не в сети
Не в сети
спасибо, может я не правильно изложил мою проблему, но необходимо вывести список имен пользователей и рядом имя страны и города. Если выводить 1го пользователя тогда все получаться а если списком то нет, как быть в данной ситуации?
Не в сети
class User extends Eloquent{
public function city()
{
return $this->belongs_to('City','id_city');
}
public function country()
{
return $this->belongs_to('Country','id_country');
}
}
Вывожу и получаю всех пользователей с городами, но как еще к ним прилепить страну не знаю:
$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)
Не в сети
Мне кажется ты неправильно сформулировал вопрос, так как не получится «правильно реализовать связи», чтобы получить то, что ты хочешь. Если твоя цель — получить за один запрос данные из нескольких полей, то связи здесь не помогут — поможет JOIN:
class User extends Eloquent { }
User
::join('country', 'id_country', '=', 'country.id')
->join('city', 'id_city', '=', 'city.id')
->get();
В любое место перед PHPget()
можешь добвить условия (PHP->where()
), группировку, сортировку или вызовы любх других методов PHPQuery
.
Не в сети
спасибо, ну с джойном понятно )) я думал может как то через связи, за 3 запроса, выбор всех данных из 3х таблиц и потом связать их по значениям. Ну с джойном проще все за 1 запрос.
Не в сети
Не в сети
и вот уже по join есть вопрос, он выводит данные, все ок. ток как быть если одинаковые название столбцов user.name, city.name, country.name, он выводит по последним... Есть какой-то AS или что-то подобное? или как решается такая задача?
Не в сети
AS можно задать для отдельный полей, для целой таблицы алиас задать нельзя, поэтому кроме как перечислением users.id as user_id, city.name as city_name, ... ничего не сделать.
Как вариант — для таблиц с самым большим числом полей не делать алиасы, а для прочих сделать:
SELECT users.*, city.name as city_name, country.name as country_name
Не в сети
Еще вариант прописать вьюху в мускуле, в которой собрать нужные поля, и работать с ней как с денормализованной таблицей, в некоторых случаях это очень даже удобно. Главное в коде не забыть откоментить откуда модель данные берет))
Изменено Cheshirrski (10.12.2012 16:16:03)
Не в сети
Не в сети
Всем спасибо, разобрались )) остаемся на join’e.
Есть другой вопрос (в эту тему или новую создавать?):
Вот action из User_Controller, все работает.
1. Как выдать 404 если нет пользователя в базе, сейчас у меня «Trying to get property of non-object»
2. в правильном ли направлении я иду?
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)
Не в сети
- Есть другой вопрос (в эту тему или новую создавать?):
Лучше в отдельную, но похожая тема уже была.
Направление правильное, но не понятно, в чём у тебя собственно проблема. User::find() возвращает или модель, или null, если такого ID нет. Что тебе мешает проверить $user == null и вернуть другую страницу, если это так?
Сейчас у тебя, очевидно, 'user' используется в шаблоне в стиле $user->login и конечно PHP ругается, что $user — не объект.
Не в сети
ясно, спасибо, то есть выход только такой?
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');
}
}
Не в сети
- ясно, спасибо, то есть выход только такой?
Ну, гм, проверить результат функции можно через if, да. Не пойму, что тебя тут сбивает с толку? Можешь вместо редиректа другой шаблон возвращать. Или внутри шаблона можешь написать что-то вроде этого:
xml@if ($user == null) <p>Нет такого пользователя!</p> @endif
Не в сети
Не в сети
Не в сети
я в blade, о пока ты тут, чет не пойму чего не работает авторизация:
$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
На первый взгляд тут дело секунду, но вот цитата из мануала:
$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)
Не в сети
Не в сети
Нда, близость форума действует расслабляюще
То, что в «username» у тебя почта — это не заслуга Laravel, а твоя собственная. Драйвер авторизации просто проверяет данные по таблице, он не умеет регистрировать новых людей — поэтому это делаешь ты где-то в своём приложении. И при регистрации устанавливаешь username в почту. Вот и всё.
Не в сети
Не в сети
Страницы 1