Laravel по-русски

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

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

#1 27.01.2013 15:38:20

Помогите освоиться

Здравствуйте, никак не смог понять как допустим создать модель/контроллер и потом вывести все это в вид. В кодеигнитере все сразу понятно было он полечге, но мне хочется разобраться в этом фреймворке может где есть какие нибудь примеры (на русском). Как например сделать выборку из бд с помощью модели обработать в контроллере и передать в вид

Не в сети

#2 27.01.2013 15:54:34

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

Re: Помогите освоиться

Посмотрите здесь. Одно и то же приложение написано на CI, Laravel, Yii, ZF, ZF2.

Изменено Cheshirrski (27.01.2013 15:56:30)

Не в сети

#3 27.01.2013 17:32:13

umarov1

Re: Помогите освоиться

Честно говоря не разобрался мне бы простой пример например есть простая таблица в ней несколько полей как вытащить все записи из нее в вид при этом с какой то обработкой в контроллере

#4 27.01.2013 21:16:48

Ikeaboy
Откуда: Киев
Сообщений: 28

Re: Помогите освоиться

Здравствуй, при переходе с CI надо четко понять определенные моменты которые там неявные.

Надеюсь вы любите футбол.

Модель, это представление вашей таблицы, например:

В БД есть таблица «football_clubs», с полями «id» (PK), «title» (VARCHAR 15), «city» (VARCHAR 15), «year» (INT 4).

Создается модель, где указываетесь статическая переменная с именем этой таблицы в БД:

PHP
class Club extends Eloquent
{
    public static 
$table 'football_clubs';

}

Теперь с этим классом можно работать, экземпляры этого класса, это записи в таблице. Название переменных аналогичны названиям полей в указанной таблице. Манипулируем в контроллере, используя методы класса Fluent, которые использует класс Eloquent, от котрого наследуется наша модель:

PHP
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

Подключаем вью:

PHP
return View::make('football.index', array('old_clubs' => $old_clubs'dynamo' => $dynamo));

Можно использовать CI способ подвязки данных ко вью:

PHP
$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, выводим во вью:

PHP
foreach($old_clubs as $club) {
    echo 
$club->title ' ' $club->city ' (' $club->year ')';
}

Или если был указан лимит в одну запись:

PHP
echo $dynamo->title ' ' $dynamo->city ' (' $dynamo->year ')';

Повторяющиеся куски кода можно вынести в модель:

PHP
class Club extends Eloquent
{
    public static 
$table 'clubs';

    public function 
full_name() {
        return 
$this->title ' ' $this->city ' (' $this->year ')';
    }

}

И использовать:

PHP
echo $dynamo->full_name(); //Выведет "Динамо Киев (1927)"

Как то так. Читаете документацию, задавайте вопросы. Удачи!

Добавил стили — Proger_XP

Изменено Proger_XP (28.01.2013 11:56:46)

Не в сети

#5 27.01.2013 21:40:53

umarov1

Re: Помогите освоиться

спс бро

#6 28.01.2013 10:40:19

Ikeaboy
Откуда: Киев
Сообщений: 28

Re: Помогите освоиться

Пожалуйста!

Не в сети

#7 05.04.2013 20:12:22

Re: Помогите освоиться

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)

Не в сети

#8 05.04.2013 20:28:01

Re: Помогите освоиться

  1. правильно ли я сделал?

Вместо 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'

Вложенный WHERE:

PHP
static::where(function ($query) {
  
$query->where('manager_id''='$user->id)->or_where('manager_id''='0);
});

Не в сети

#9 06.04.2013 21:16:46

Re: Помогите освоиться

  1. правильно ли я сделал?

Вместо 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'

Вложенный WHERE:

PHP
static::where(function ($query) {
  
$query->where('manager_id''='$user->id)->or_where('manager_id''='0);
});

спасибо. а вообще правильно что в модели все эти проверки делаю?

Изменено newbie (06.04.2013 21:41:21)

Не в сети

#10 06.04.2013 21:35:30

Re: Помогите освоиться

И еще вопрос, у меня есть форма.
Если он admin или manager, то все поля можно обновлять данного объекта, а если shipper, то только пару полей. например, если есть поля:

PHP
name
url
notes
ship_at
delivery_at

то shipper может изменить только ship_at и delivery_at.

на ум приходит только это:
взять 2 массива

PHP
$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'),
);

а потом

PHP
Order::update($id$user->is('Shipper')?$orderinfo_ship:$orderinfo_all);

так сойдет или есть более правильный путь?

Изменено newbie (06.04.2013 21:37:21)

Не в сети

#11 07.04.2013 10:07:44

Re: Помогите освоиться

  1. а вообще правильно что в модели все эти проверки делаю?

Желательно такие вещи из модели убирать в контроллер, так как иногда может понадобиться сделать больше, чем может текущий пользователь (или вообще гость) и тогда придётся изобретать какие-то флаги, чтобы модель не проверяла права.

  1. так сойдет или есть более правильный путь?

Как один из вариантов — вполне. Другой путь — изменять PHPOrder::$accessible.

Не в сети

#12 07.04.2013 16:38:36

Re: Помогите освоиться

Спасибо еще раз. Вынесу в контроллер.

А насчет Order::$accessible не думал, что можно "на лету" изменять.

Не в сети

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