С методом save() можно получить id только что созданной записи PHP: $this->image = $fileName; $this->description = $description; $this->id_user = Auth::id(); $this->save() $this->id; А как это получить id, когда запись создаться методом create, или вообще нельзя? PHP: $this::create([ 'image' => $fileName, 'description' => $description, 'id_user' => Auth::id() ]);
https://laravel.com/api/5.7/Illuminate/Database/Eloquent/Builder.html#method_create Save a new model and return the instance. Return Value Model|$this https://stackoverflow.com/questions/151969/when-to-use-self-over-this
Ну если $this = self::create($array); тогда возможно А вообще нужно делать по людски PHP: $post = self::create($array); // \App\Post::create($array); return $post->id; Если уж так хочется вынести в модель
@Dimon2x, просто ты не сильно понимаешь, как работает $this::create(...). Эта дебильная форма записи работает ровно как self::create(...), и, соответственно, текущий $this не меняет.
Ну для меня было странным открытие, что слева может быть любой экземпляр класса. Не представляю, нафига это сделано. Но не мне судить авторов PHP
потому что.. --- Добавлено --- PHP: $test = new Test; $test->int = 2; $test->intPlus2(); $test->int; // 2 + 2 = 4 Ты создаешь объект у которого есть свойства и методы которые знают друг о друге PHP: $intPlus2 = Test::intPlus2(2); Объект не создается. Никаких свойств и методов нет. Ты передаешь параметры и получаешь результат. Обращаться к статику через $this не правильно. Так как этот метод не имеет никакого отношения к конкретно созданному экземпляру объекта.
@keren, если ты перед :: ставишь экземпляр класса, то PHP, фактически, просто делает get_class, и у полученного класса вызывает указанный статический метод. Потому что такое поведение не очевидно.
Как преобразовать код построителя запросов в Eloquent? Код работает, но некоторые говорят, что это плохой пример, и его нужно переписать в отношения, но я не знаю, как, вы можете сказать? Статьи могут быть добавлены в разные категории Метод addRelation получает массив с значениями категории и идентификатором статьи и после обработки эти данные добавляются к промежуточной таблице Код (Text): array:2 [▼ 0 => "1" 1 => "2" ] Код (Text): public function addRelation($categories, $id) { $categoryId = []; $collection = collect($categories); $collection = $collection->chunk(1); $collection->each(function ($item, $key) use (&$categoryId, $id){ $categoryId[] = [ 'image_id' => $id, 'category_id' => $item->first() ] ; } ); DB::table('category_image')->insert($categoryId); } Удаление Код (Text): public function deleteImage($image) { Storage::delete($image->image); $this->destroy($image->id); DB::table('category_image')->where('image_id', $image->id)->delete(); } Модели Код (Text): class Image extends Model { public function categories() { return $this->belongsToMany(Category::class); } } class Category extends Model { protected $fillable = ['name']; public $timestamps = false; public function article() { return $this->belongsToMany('App\Services\Image'); } } это типа меток длят статей ///////////////////////////////////////////////////////////// Код (Text): Schema::create('categories', function (Blueprint $table) { $table->increments('id'); $table->string('name'); }); Код (Text): Schema::create('images', function (Blueprint $table) { $table->increments('id'); $table->string('image'); $table->timestamps(); }); Код (Text): Schema::create('category_image', function (Blueprint $table) { $table->increments('id'); $table->integer('image_id'); $table->integer('category_id'); });
Почему выводит null? Код (Text): $relation = \App\Services\Image::find($idNewImage); dd($relation->categories()->attach($categories));
Вот такой запрос получился Код (Text): (SQL: insert into `category_image` (`category_id`, `image_id`, `0`, `1`) values (18, 18, 1, 2) Это неверный запрос, из-за этого выводит ошибку. PHP: $relation = \App\Services\Image::find($idNewImage); dd($relation->categories()->attach($idNewImage, $categories)); Надо что бы был примерно такой запрос Код (Text): insert into `category_image` (`category_id`, `image_id`) values ( 2, 18) И получается, если надо будет добавить во многие категории, то должно быть несколько запросов? --- Добавлено --- То что выводит null, кажись это работает. --- Добавлено --- Короче вот решение, которое должно быть PHP: public function store(Request $request) { $rules = [ 'description' => 'min:4', 'image' => 'required|image|mimes:jpg,jpeg,png', 'choose-category' => 'array|required' ]; $messages = [ 'description.min' => 'Название должно содержать минимум :min символа.', 'image.required' => 'Изображение загружать обязательно.', 'image.image' => 'Вы загрузили не изображение.', 'image.mimes' => 'Допустимые форматы: jpg, jpeg, png.', 'choose-category.required' => 'Выберите категорию' ]; Validator::make( $request->all(), $rules , $messages )->validate(); $image = $request->file('image'); $description = $request->input('description'); $this->imageClass->add($image, $description); $this->imageClass->save(); $idNewImage = $this->imageClass->id; $categories = $request->input('choose-category'); $relation = \App\Services\Image::find($idNewImage); $relation->categories()->attach($categories); //$this->imageClass->addRelation($categories, $idNewImage); return redirect('/'); } --- Добавлено --- оказывается всё так просто
Как получить доступ к #original? PHP: Master {#1018 ▼ #connection: "mysql" #table: null #primaryKey: "id" #keyType: "int" +incrementing: true #with: [] #withCount: [] #perPage: 15 +exists: true +wasRecentlyCreated: false #attributes: array:3 [▼ "id" => 2 "specialization" => "Гипсокартон" "countMaster" => 1 ] #original: array:4 [▼ "id" => 2 "specialization" => "Гипсокартон" "pivot_category_letter_id" => 4 "pivot_master_id" => 2 ] #changes: []
Вывожу количество комментов. В модели постов создал метод PHP: public function comments() { return $this->hasMany('App\Comment', 'post_id', 'id'); } В шаблоне, начинается цикл статей, в каждом цикле пишу PHP: <div class="comments"> <a href="/post/{{$post->id}}">{{$post>comments->count()}} комментариев</a> </div> Теперь решил добавить этот метод, к общей выборке PHP: $allPosts = Posts::with(''users') ->with('comments') ->paginate(5); И в шаблоне ничего менять не пришлось. Так как теперь это работает? Делает 1 запрос за раз или при каждом цикле? Раньше было так PHP: $allPosts = Posts::with(''users') ->paginate(5);
Пара вопросов: Для чего делается вызов with()? Что ты получаешь, если имя связи используешь без скобок, запрос или коллекцию? --- Добавлено --- https://github.com/barryvdh/laravel-debugbar - про эту штуку в курсе? Все запросы к БД тебе покажет
@mkramer почитал и понял, что with выбирает все данные из таблицы, это как альтернатива SELECT * ? --- Добавлено --- Когда обращаюсь без скобок, то получаю коллекцию, а со скобками объект, название связи и в нём что-то лежит, в том числе и коллекция, которая присоединилась.
Аж две Нет, коллекцию ты не получаешь, ты получаешь, объект Relation, который является особой надстройкой на Builder-ом Eloquent Прочитать может и прочитал, а не понял нифига with заставляет Eloquent получить сразу все связанные данные для всей коллекции результатов запроса, и потом раскидать по моделям. Таким образом количество запросов сокращается. И в доке этот момент очень подробно разобран