Laravel по-русски

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

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

#1 29.11.2016 20:20:16

Как у модели сделать доступными для заполнения все атрибуты

Ну вот массив
protected $fillable = ['id', 'created_at', 'updated_at','bb'];
А надо чтоб вообще все текущие и будущие поля сразу были доступны для заполнения.


Связь со мной:
Скайп(с аватаркой) - shyraks
Телеграм - @Mramoris или +7 999 260 13 20

Не в сети

#2 29.11.2016 20:36:44

Re: Как у модели сделать доступными для заполнения все атрибуты

Удали объявление $fillable и добавь

protected static $unguarded = true;

Но это опасно.

Не в сети

#3 29.11.2016 20:47:04

Re: Как у модели сделать доступными для заполнения все атрибуты

Я больше советую использовать метод статичный unguarded, например:

/** @var Post $post **/
$post = Post::findOrFail(1);
Post::unguarded(function () use ($request, $post) {
$post->fill($request->all())->save();
});

Но это опасно.
https://laravel.ru/forum/viewtopic.php?pid=10319#p10319

Не в сети

#4 29.11.2016 23:23:21

Re: Как у модели сделать доступными для заполнения все атрибуты

covobo пишет:

Удали объявление $fillable и добавь

protected static $unguarded = true;

вот это выдаёт
preg_replace(): Parameter mismatch, pattern is a string while replacement is an array


Связь со мной:
Скайп(с аватаркой) - shyraks
Телеграм - @Mramoris или +7 999 260 13 20

Не в сети

#5 30.11.2016 10:33:15

Re: Как у модели сделать доступными для заполнения все атрибуты

А второй вариант обработанный

use Illuminate\Database\Query\Builder;
$post = YourModelName5::findOrFail($id);
            YourModelName5::unguarded(function () use ($request, $post) {
                $post->fill($request->all())->save();
            });

Выдаёт
Call to undefined method Illuminate\Database\Query\Builder::unguarded()


Связь со мной:
Скайп(с аватаркой) - shyraks
Телеграм - @Mramoris или +7 999 260 13 20

Не в сети

#6 30.11.2016 12:44:55

Re: Как у модели сделать доступными для заполнения все атрибуты

covobo пишет:

Удали объявление $fillable и добавь

protected static $unguarded = true;

лучше сразу отдай обезьяне ядерную бомбу.

Не в сети

#7 30.11.2016 13:00:01

Re: Как у модели сделать доступными для заполнения все атрибуты

hzone пишет:
covobo пишет:

Удали объявление $fillable и добавь

protected static $unguarded = true;

лучше сразу отдай обезьяне ядерную бомбу.

Это что, делает все поля доступными для массового заполнения?

Не в сети

#8 30.11.2016 17:32:06

Re: Как у модели сделать доступными для заполнения все атрибуты

Kirir пишет:

Выдаёт
Call to undefined method Illuminate\Database\Query\Builder::unguarded()

кхм, сам не проверял, смотрел исходники.
Есть ещё один метод - forceFill, который делает тоже самое (использует статичный метод unguarded())
$post->forceFill($request->all())

Не в сети

#9 30.11.2016 18:19:38

Re: Как у модели сделать доступными для заполнения все атрибуты

Не работает почему-то. Ошибок не выдаёт, но и значения не обновляет.


Связь со мной:
Скайп(с аватаркой) - shyraks
Телеграм - @Mramoris или +7 999 260 13 20

Не в сети

#10 30.11.2016 18:28:28

Re: Как у модели сделать доступными для заполнения все атрибуты

Ставлю и с $unguarded и без, полями и без, всё равно ничё не происхоидт и ошибки нет. Работает ток update, но для него нужны поля.

   // protected static $unguarded = true;

//protected $table = 'your_model_name5s';
protected $fillable = ['bb2','bb'];
    //


////////////
            YourModelName5::find($id)->update($request->all());
            YourModelName5::find($id)->forceFill($request->all());


Связь со мной:
Скайп(с аватаркой) - shyraks
Телеграм - @Mramoris или +7 999 260 13 20

Не в сети

#11 30.11.2016 21:26:05

Re: Как у модели сделать доступными для заполнения все атрибуты

после ->forceFill() надо делать ->save()
$post->forceFill($request->all())->save();
ну, или, на совсем крайний случай
foreach ($request->all() as $fieldName => $fieldValue) {
  $post->setAttribute($fieldName, $fieldValue);
}
$post->save();

Изменено covobo (30.11.2016 21:28:42)

Не в сети

#12 30.11.2016 22:08:40

Re: Как у модели сделать доступными для заполнения все атрибуты

Ребят, не изобретайте велосипедов, используйте $fillable. Зачем создавать проблемы на пустом месте себе/заказчику/человеку, который будет поддерживать проект?

Не в сети

#13 30.11.2016 22:13:08

Re: Как у модели сделать доступными для заполнения все атрибуты

AlexeyMezenin пишет:

Ребят, не изобретайте велосипедов, используйте $fillable. Зачем создавать проблемы на пустом месте себе/заказчику/человеку, который будет поддерживать проект?

Может у него там вообще NoSQL бд.
Хочет - пускай делает)

Не в сети

#14 06.12.2016 13:22:50

Re: Как у модели сделать доступными для заполнения все атрибуты

  1. $post->forceFill($request->all())

Бгг, ну да, «решение». За такое к программированию на пушечный выстрел подпускать нельзя. Это позволяет переписать любые поля в Post, включая скрытые типа is_sticky, created_at, … (конечно, список зависит от конкретной таблицы). Большущая дыра.

Не в сети

#15 06.12.2016 14:21:28

Re: Как у модели сделать доступными для заполнения все атрибуты

Proger_XP пишет:

}%> %%$post->forceFill($request->all())%%
Бгг, ну да, "решение". За такое к программированию на пушечный выстрел подпускать нельзя. Это позволяет переписать любые поля в Post, включая скрытые типа is_sticky, created_at, ... (конечно, список зависит от конкретной таблицы). Большущая дыра.

хардкодинг на фреймворке это )))))))))
И про дыру - даааааа. В голове дыра....

Изменено hzone (06.12.2016 14:23:31)

Не в сети

#16 06.12.2016 15:30:45

Re: Как у модели сделать доступными для заполнения все атрибуты

заминусовали.

Если автору надо - пускай делает, вам то какая разница.
Никто не заставляет вас использовать unguarded & forceFill.

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

ProgerXP - это кто дал тебе права решать за других, как можно, а как нельзя?

Изменено covobo (06.12.2016 15:33:07)

Не в сети

#17 06.12.2016 15:39:25

гость15

Re: Как у модели сделать доступными для заполнения все атрибуты

Proger_XP пишет:

}%> %%$post->forceFill($request->all())%%
Бгг, ну да, "решение". За такое к программированию на пушечный выстрел подпускать нельзя. Это позволяет переписать любые поля в Post, включая скрытые типа is_sticky, created_at, ... (конечно, список зависит от конкретной таблицы). Большущая дыра.

Думаю зря вы так напали. $request - можно отфильтровать перед этим.

#18 06.12.2016 15:46:48

Re: Как у модели сделать доступными для заполнения все атрибуты

гость15 пишет:
Proger_XP пишет:

}%> %%$post->forceFill($request->all())%%
Бгг, ну да, "решение". За такое к программированию на пушечный выстрел подпускать нельзя. Это позволяет переписать любые поля в Post, включая скрытые типа is_sticky, created_at, ... (конечно, список зависит от конкретной таблицы). Большущая дыра.

Думаю зря вы так напали. $request - можно отфильтровать перед этим.

Да и в целом - какой вопрос, такой и ответ.

Не в сети

#19 06.12.2016 15:57:58

Re: Как у модели сделать доступными для заполнения все атрибуты

Действительно. Kirir весь форум испакостил вопросами, за которые его в серьезной конторе и дня бы не продержали. А, конкретно, здесь, он спросил - получил ответ, с предупреждением, причем не одним.

Не в сети

#20 06.12.2016 17:22:49

Re: Как у модели сделать доступными для заполнения все атрибуты

  1. ProgerXP — это кто дал тебе права решать за других, как можно, а как нельзя?

Человек может как угодно извращаться, я ничего никому не запрещаю. Но форум это не приватная беседа для двоих. Сюда зайдут такие же новички, которые ищут ответы на вопросы, увидят ваши «решения», запомнят и понесут в свои проекты.

Повторяю — forceFill, unguarded, … это огромная проблема. Вот у вас пистолет с предохранителем. Вы его видите в первый раз, и так и эдак крутите — не стреляет. Тут кто-то говорит «да дёрни ты вон ту штучку». Вы дёргаете и попадаете себе/советнику в ногу/руку/голову. То есть начальных знаний у вас нет, вам дали быстрое и лёгкое решение, за что вы и поплатились. И ладно если только вы.

Здесь тоже самое. Простейший пример — форма регистрации:

xml<form action="reg">
  <input name="login">
  <button type="submit">Reg</button>
</form>

Таблица с пользователями:

id
is_admin
login
...

В нормальном случае адрес запроса:

/reg?login=my_login

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

/reg?login=my_login&is_admin=1

В итоге если у вас там всё fillable, то вы вставляете в таблицу запись с is_admin = 1, что делает нового пользователя админом на сайте.

Неужели не понятно, чем это грозит?

Кто думает, что это всё теория и в реальном мире никогда не происходит — ошибается. Два года назад был нашумевший случай с GitHub’ом (Хабр), когда человек смог сделать коммит в репо, даже не имея прав на запись туда, просто добавив в форму лишнее поле. То есть один-в-один этот случай.

Не в сети

#21 06.12.2016 18:29:20

Re: Как у модели сделать доступными для заполнения все атрибуты

Proger_XP пишет:

Неужели не понятно, чем это грозит?

Мне кажется это и так понятно всем. Настолько понятно, что и говорить нет смысла.
Вы думаете никто здесь не понимает, что это плохо?
Если он хочет стрельнуть себе в ногу - пускай.

Изменено covobo (06.12.2016 18:31:16)

Не в сети

#22 06.12.2016 18:57:49

Re: Как у модели сделать доступными для заполнения все атрибуты

По поводу новичков - в комментариях были предупреждения.

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

Не в сети

#23 06.12.2016 21:11:47

Re: Как у модели сделать доступными для заполнения все атрибуты

  1. Не пойму, зачем было редактировать мои комментарии и говорить, что так нельзя, ведь я просто ответил на вопрос.

Я уже написал почему. Люди видят решение и дальше не читают.

  1. Вы думаете никто здесь не понимает, что это плохо?

Если даёте заведомо опасное решение — говорите зачем, что и почему, ибо кто понимает, что это плохо, таких вопросов не задаёт.

Сделал свои правки менее категоричными, но учтите на будущее.

Не в сети

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