Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте, никак не смог понять как допустим создать модель/контроллер и потом вывести все это в вид. В кодеигнитере все сразу понятно было он полечге, но мне хочется разобраться в этом фреймворке может где есть какие нибудь примеры (на русском). Как например сделать выборку из бд с помощью модели обработать в контроллере и передать в вид
Не в сети
Посмотрите здесь. Одно и то же приложение написано на CI, Laravel, Yii, ZF, ZF2.
Изменено Cheshirrski (27.01.2013 15:56:30)
Не в сети
Честно говоря не разобрался мне бы простой пример например есть простая таблица в ней несколько полей как вытащить все записи из нее в вид при этом с какой то обработкой в контроллере
Здравствуй, при переходе с CI надо четко понять определенные моменты которые там неявные.
Модель, это представление вашей таблицы, например:
В БД есть таблица «football_clubs», с полями «id» (PK), «title» (VARCHAR 15), «city» (VARCHAR 15), «year» (INT 4).
Создается модель, где указываетесь статическая переменная с именем этой таблицы в БД:
class Club extends Eloquent
{
public static $table = 'football_clubs';
}
Теперь с этим классом можно работать, экземпляры этого класса, это записи в таблице. Название переменных аналогичны названиям полей в указанной таблице. Манипулируем в контроллере, используя методы класса Fluent, которые использует класс Eloquent, от котрого наследуется наша модель:
class Football_Controller extends Base_Controller
{
public function action_index()
{
//Писать будем тут
}
}
$club = new Club;
$club->title = "Динамо";
$club->city = "Киев";
$club->year = 1927;
$club->save(); //Создана запись в таблице.
$club = new Club(array('title' => 'Реал', 'city' => 'Мадрид', 'year' => 1902));
$club->save(); //Создана еще одна запись в таблице.
$club = new Club(array('title' => 'Юнайтед', 'city' => 'Манчестер', 'year' => 1878));
$club->save(); //И еще одна.
$clubs = Club::all(); //Вернет все клубы
$dynamo = Club::find(1); //Найдет по ключу (ID)
$real_and_atletico = Club::where('city', '=', 'Мадрид')->get(); //Вернет массив клубов из Мадрида
$real = Club::where('city', '=', 'Мадрид')->first(); //Только первый попавшийся клуб из Мадрида (LIMIT 1)
$old_clubs = Club::where('year', '<', '1900')->order_by('year', 'desc')->get(); //Вернет все клубы у которых год меньше 1900
return View::make('football.index', array('old_clubs' => $old_clubs, 'dynamo' => $dynamo));
Можно использовать CI способ подвязки данных ко вью:
$data['dynamo'] = Club::where('title', '=', 'Динамо')->where('city', '=', 'Киев')->first();
$data['old_clubs'] = Club::where('year', '<', '1900')->order_by('year', 'desc')->get();
return View::make('football.index', $data);
А дальше по аналогии с CI, выводим во вью:
foreach($old_clubs as $club) {
echo $club->title . ' ' . $club->city . ' (' . $club->year . ')';
}
Или если был указан лимит в одну запись:
echo $dynamo->title . ' ' . $dynamo->city . ' (' . $dynamo->year . ')';
Повторяющиеся куски кода можно вынести в модель:
class Club extends Eloquent
{
public static $table = 'clubs';
public function full_name() {
return $this->title . ' ' . $this->city . ' (' . $this->year . ')';
}
}
echo $dynamo->full_name(); //Выведет "Динамо Киев (1927)"
Как то так. Читаете документацию, задавайте вопросы. Удачи!
Изменено Proger_XP (28.01.2013 11:56:46)
Не в сети
спс бро
Пожалуйста!
Не в сети
public static function get_orders($user)
{
if ($user->is('Admin')) {
return static::query();
}
if ($user->is('Manager')) {
return static::where('manager_id', '=', $user->id)->or_where('manager_id', '=', 0);
} elseif ($user->is('Shipper')) {
return static::where('shipper_id', '=', $user->id)->or_where('shipper_id', '=', 0);
} elseif ($user->is('Dealer')) {
return static::where('user_id', '=', $user->id);
}
}
это у меня в модели. все работает. правильно ли я сделал?
Изменено newbie (05.04.2013 20:12:50)
Не в сети
- правильно ли я сделал?
Вместо where()->or_where() я бы сделал вложенный where(), так как может получиться, что для менеджера вернётся запрос с установленными условиями manager_id = X OR manager_id = 0, а в коде затем добавится ещё одно and-условие и запрос станет некорректным без скобок:
...::get_orders($user)->where('x', '=', 'y');
// = SELECT ... WHERE manager_id = X OR manager_id = 0 AND x = 'y'
static::where(function ($query) {
$query->where('manager_id', '=', $user->id)->or_where('manager_id', '=', 0);
});
Не в сети
- правильно ли я сделал?
Вместо where()->or_where() я бы сделал вложенный where(), так как может получиться, что для менеджера вернётся запрос с установленными условиями manager_id = X OR manager_id = 0, а в коде затем добавится ещё одно and-условие и запрос станет некорректным без скобок:
PHP...::get_orders($user)->where('x', '=', 'y');
// = SELECT ... WHERE manager_id = X OR manager_id = 0 AND x = 'y'PHPstatic::where(function ($query) {
$query->where('manager_id', '=', $user->id)->or_where('manager_id', '=', 0);
});
спасибо. а вообще правильно что в модели все эти проверки делаю?
Изменено newbie (06.04.2013 21:41:21)
Не в сети
И еще вопрос, у меня есть форма.
Если он admin или manager, то все поля можно обновлять данного объекта, а если shipper, то только пару полей. например, если есть поля:
name
url
notes
ship_at
delivery_at
то shipper может изменить только ship_at и delivery_at.
на ум приходит только это:
взять 2 массива
$orderinfo_all = array(
'name' => Input::get('name'),
'url' => Input::get('url'),
'notes' => Input::get('notes'),
'ship_at' => Input::get('ship_at'),
'delivery_at' => Input::get('delivery_at'),
);
$orderinfo_ship = array(
'ship_at' => Input::get('ship_at'),
'delivery_at' => Input::get('delivery_at'),
);
Order::update($id, $user->is('Shipper')?$orderinfo_ship:$orderinfo_all);
так сойдет или есть более правильный путь?
Изменено newbie (06.04.2013 21:37:21)
Не в сети
- а вообще правильно что в модели все эти проверки делаю?
Желательно такие вещи из модели убирать в контроллер, так как иногда может понадобиться сделать больше, чем может текущий пользователь (или вообще гость) и тогда придётся изобретать какие-то флаги, чтобы модель не проверяла права.
- так сойдет или есть более правильный путь?
Как один из вариантов — вполне. Другой путь — изменять PHPOrder::$accessible
.
Не в сети
Спасибо еще раз. Вынесу в контроллер.
А насчет Order::$accessible не думал, что можно "на лету" изменять.
Не в сети
Страницы 1