Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Не совсем врубаюсь пока в механику работы Eloquent’a. Есть следующие модели:
// User
class User extends Eloquent
{
public function account() {
return $this->has_many('Account');
}
}
// Account
class Account extends Eloquent
{
public function user() {
return $this->belongs_to('User');
}
}
$credits = 10;
User::find(Auth::user()->id)->account()->save(array('summa' => DB::raw('summa + ' . $credits));
приводит к Argument 1 passed to Laravel\Database\Eloquent\Model::fill() must be an array, string given, менял условия, упращал вплоть до примера из http://laravel.ru/articles/rees/eloquent — все едино, одна и таже ошибка. ЧЯДНТ?
Вообще, в оригинале, хотелось бы не городить огород с DB::raw вообще, а вынести все операции с базой в модель, где собственно этому и место, что то типа:
// User
class User extends Eloquent
{
public function account() {
return $this->has_many('Account');
}
}
// Account
class Account extends Eloquent
{
public function user() {
return $this->belongs_to('User');
}
public function add_demo_credits($credits) {
if ($this->get_attribute('demo_flag') === 'demo') {
$credits += $this->get_attribute('summa');
$this->set_attribute('summa', $credits);
}
}
}
Поскольку записей в Account приходится по две на одного User, а разница в демо_флаге, то хотелось бы разделить на два метода в модели, чем добавлять условие ->where в запрос контроллера. Но и в этом случае я не знаю как достучаться до этого метода add_demo_credits($credits) отталкиваясь от Auth::user(). Не подскажете, как это сделать просто и красиво?
Не в сети
PHPEloquent->save()
никак не может работать в такой форме, у него нет аргументов. Да и в целом команду можно упростить:
User::find(Auth::user()->id)->account()->save(array('summa' => DB::raw('summa + ' . $credits));
Auth::user()->account()->fill(array('summa' => "summa + $credits"))->save();
Обрати внимание, что PHPAuth::user()
может вернуть null, поэтому перед таким запросом всегда проверяй, что кто-то авторизован — PHPAuth::check()
или PHPAuth::guest()
(обратное).
PHP$this->get_attribute('demo_flag')
Это можно просто заменить на PHP$this->demo_flag
; тоже самое с PHPset_attribute()
.
- Поскольку записей в Account приходится по две на одного User, а разница в демо_флаге, то хотелось бы разделить на два метода в модели
public function demoAccount() {
return $this->has_many('Account')->where('demo_flag', '=', 'demo');
}
public function account() {
return $this->has_many('Account')->where('demo_flag', '!=', 'demo');
}
Не в сети
Auth::user()->demoAccount()->fill(array('summa' => "summa+ $credits"))->save();
бросается эксепшен: Method [fill] is not defined on the Query class., заменил на
Auth::user()->demoAccount()->update(array('summa' => "summa+ $credits"));
тут выругался на SQLSTATE[HY000]: General error: 1366 Incorrect decimal value: 'summa+ 1.00' for column 'summa', не желает это цеплять на `summa` = ? в SQL запросе, фиг с ним, заменил в итоге на:
Auth::user()->demoAccount()->update(array('summa' => DB::raw('summa+ ' . $credits)));
и все поехало как надо. Большое спасибо за совет. Теперь чуть лучше представляю себе как это делать через Eloquent, а то с горя думал перевести проект под Fluent
Не в сети
Насчет Auth::user(), эту штуку я проверяю через фильтр before в маршруте перед вызовом контроллера, но совсем упустил из виду момент, что перейти то юзер перешел, но вот после может провисеть без активных действий до экспаеринга сессии и как только совершит действия, тут от этот нулл и вылезет, а перехвата нет, только что проверил и получил висящего и ничего не понимающего «что происходит?» юзера в мемберке.
PS: действия пользователя шли через Ajax, фильтр то отработал свое, но ничего в обратку JS не вернул, так что все равно — бага
Изменено John (29.10.2012 13:38:16)
Не в сети
Не в сети
fill()->save() ты правильно заменил на update().
Насчёт summa я не понял сразу, что ты её увеличиваешь одним запросом (я думал ты её в строку устанавливаешь) — тогда всё верно, хотя я бы на твоём месте проверил, что $credits — действительно число, иначе сделать SQL-инъекцию раз плюнуть.
Не в сети
Страницы 1