За последние 24 часа нас посетили 17836 программистов и 1608 роботов. Сейчас ищут 1360 программистов ...

Многие ко многим

Тема в разделе "Laravel", создана пользователем Dimon2x, 28 июн 2018.

  1. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если работаешь в IDE, то переименование переменное не проблема. Судя по всему ты работаешь не в IDE или не знаешь пока всю её мощь и силу. Переименуй переменную. Учи силу, Люк.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Dimon2x Приучайся сразу называть переменные так, чтоб это отражало суть использования. Если у тебя изображения называются постами, посты - булочками, а булочки - булыжниками, то ты же сам через пол года не въедешь, а что делает твой код.

    Кстати, я тебе тоже самое ответил, что на стеке, только без кода :) Здесь не принято код за людей писать. А вообще, что-то ларка для тебя сложная, зря ты с неё начал. У меня это уже 3 фреймворк (не считая микрофреймворков, на которых делал несколько простых проектов), поэтому мне сразу всё понятно. Хотя и с первым тонну тем про то, что и так в доках описано, я здесь не плодил...
     
  3. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @mkramer тебе проще думать
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Laravel местами очень удобный, хоть и тормознутый, но какой-то неочевидный для меня, если честно. А уж если в код его залезть - сразу рука к бутылке тянется (а я, если мне что во фреймворке не понятно, всегда лезу в код отладчиком). Мне поэтому Yii2 больше нравится - как-то там всё очень очевидно. И код самого фреймворка попроще будет
     
  5. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Думаю, как лучше сделать.

    Если удалить категорию, удалять ли все статьи, которые в ней лежат? При условии, то, что те статьи, которые в ней лежат, могут ещё находится в других категориях, а это не хорошо, ели они удалятся из других категорий.

    Может просто удалить категорию и данные из пивотной таблицы, а саму статью не удалять, а сделать ещё 1 ссылку на статьи без категорий?
    --- Добавлено ---
    И вообще на сайтах я не видел, что бы удаляли категории.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    просто предложи выбрать другую категорию, куда переложить статьи, переложи статьи и удали категорию. канэц.
     
  7. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @igordata Я сделал так:

    когда категория удаляется, то ищутся все статьи этой категории и потом проверяется, есть ли такая статья в другой категории,
    если есть, то категория удаляется, а сама статья не удаляется, так как она есть ещё в другой категории.
    Если такой статьи больше нету в другой категории, то категория удаляется с этой статьёй.

    Потом всё автоматически периделыватеся и отображается, к каким категориям относится данная статья.

    Нормальный способ я выбрал?

    /////////////////////////////////////////////////////////////////////////////////////////////

    Например, было так:

    Статья 1
    Категории 1,3,4

    Статья 2
    Категории 1,2,

    Статья 3
    Категории 4, 1

    ///////////////////////////////////////////////////////////////////////////

    После удаления категории 1 будет так:

    Статья 1
    Категории 3,4

    Статья 2
    Категории 2

    Статья 3
    Категории 4
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Dimon2x, если делаешь проект для себя - решай для себя, нормальный или нет. Если тебе норм - то ОК. Если делаешь проект для заказчика, то такие вещи должен решать заказчик.
     
  9. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Dimon2x, если пилишь в целях обучения, пили так как сможешь, только исходя из доки. Потом, как получишь рабочую реализацию, думай о оптимизации, смотри что работает не правильно/плохо и проводи рефакторинг. Всеравно, все что тебе тут скажут ты не запомнишь. )
     
  10. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Лучше переводить в статус неопубликованных а дальше если нужно или удаляешь или меняешь категорию. Или создать категорию без категории
     
  11. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Продолжаю с удалением.

    При удалении категории, удаляются в ней статьи.

    Была такая каша

    PHP:
    1.  public static function deleteCategory($id)
    2.     {
    3.          $posts = DB::table('category_image')->select('image_id')->
    4.                 where('category_id', $id)->get();
    5.      
    6.      
    7.         $posts->each(function ($item, $key) use (&$id) {
    8.          
    9.             //потом надо посчитать, сколько таких одинаковых статей
    10.          
    11.             $countPosts = DB::table('category_image')->where('image_id', $item->image_id)->count();      
    12.          
    13.             //если есть ещё эта статья в другой категории
    14.             //то удалить только дубликаты
    15.          
    16.              if($countPosts != 1) {  
    17.                 self::deletePivot($id, $item->image_id);
    18.                 if(Category::find($id)) {
    19.                      Category::find($id)->delete();
    20.                 }
    21.             }
    22.            else {
    23.                 self::deletePivot($id, $item->image_id);
    24.                 Storage::delete(Image::find($item->image_id)->image);            
    25.                 Image::destroy($item->image_id);
    26.              
    27.                 if(Category::find($id)) {
    28.                      Category::find($id)->delete();
    29.                 }
    30.             }
    31.        
    32.         });
    33.      
    34.     if(Category::find($id)) {
    35.            Category::find($id)->delete();
    36.         };
    37.     }
    PHP:
    1. public static function deletePivot($categoryId, $imageId)
    2.     {
    3.          DB::table('category_image')->where([
    4.             ['category_id', '=', $categoryId],
    5.             ['image_id', '=', $imageId],
    6.             ])->delete();
    7.     }
    //////////////////////////////////////////////////////////////////////////////////////////

    Переделал на такую штуку

    PHP:
    1. public function destroy($id)
    2.     {
    3.         $posts = collect(DB::table('category_image')->select('image_id')->
    4.                 where('category_id', $id)->get()->implode('image_id', ','));  
    5.      
    6.        $deletePivot = explode(',', $posts->values()->first());
    7.        $relation = Category::find($id);
    8.        $relation->article()->detach($deletePivot);
    9.        $relation->delete();
    10.  
    11.        $notCategories = Image::doesntHave('categories')->get();
    12.      
    13.        $notCategories->each(function($item, $key){
    14.             Storage::delete($item->image);
    15.             $item->delete();
    16.        });
    17.    
    18.        //Category::deleteCategory($id);
    19.      
    20.         return redirect()->route('admin.categories');
    21.     }
    Так лучше? Как можно ещё лучше отрефакторить?
     
  12. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Никак не могу додуматься, как вывести город у пользователя.

    PHP:
    1. $masters = Master::find($id)->users()->get();
    Вот такая коллекция возвращается

    PHP:
    1. "id" => 1
    2.         "name" => "DimaK"
    3.         "email" => "dima@yandex.ru"
    4.         "email_verified_at" => null
    5.         "password" => "$2y$10$iPrse1TeMPaZ9Q19wpyZveNW.EXNIiV3RDx.QpHVGR4FwkFEiYmSG"
    6.         "remember_token" => null
    7.         "created_at" => "2018-09-25 07:26:24"
    8.         "updated_at" => "2018-09-30 07:01:26"
    9.         "avatar" => "uploads/users/ava.png"
    10.         "city_id" => 4014
    11.         "description" => "2222"
    12.         "pivot_master_id" => 3
    13.         "pivot_user_id" => 1
    Надо как-то добавить для каждого пункта коллекции, город пользователя, отыскать его по полю city_id

    Я делаю так

    PHP:
    1. dd(City::where('city_id', $masters[0]->city_id)->get()[0]->name);
    Но думаю это неправильно, и не знаю, как потом перезаписать коллекцию, ведь пользователей будет много.

    Можно ли как-то сделать цикл, где я буду делать запрос для каждого пользователя

    И потом как-то добавить это поле в коллекцию?

    Или есть более лучший способ?

    PHP:
    1. $masters = Master::find($id)->users()->get();
    2.         foreach($masters as $master){
    3.          
    4.            echo City::where('city_id', $master->city_id)->get()[0]->name;
    5.         }
     
  13. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Я сделал так допустимо ли?

    PHP:
    1.  $masters = Master::find($id)->users()->get();
    2. $collection = $masters->each(function ($item, $key){
    3.     array_add($item, 'cityName', City::where('city_id', $item->city_id)->get()[0]->name);
    4. });
    5. dd($collection);
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    belongsTo, with. Твоё решение генерит много запросов слишком
     
  15. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Вот вечно у тебя беда с неймингом
    PHP:
    1. $master = Master::find($id)->with('users.city')
    2. // или
    3. $users = Master::find($id)->users()->with('city')
    + belongsTo
     
    Dimon2x нравится это.
  16. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    После объединения таблиц, я вывожу данные, используя ключ 0, можно ли как-то выводить по другому, без этого нуля?

    Например, объединил таблицу юзеров и городов

    PHP:
    1. $user = User::with('city')->where('id', $userId)->get();
    Результат:

    Код (Text):
    1. Collection {#671 ▼
    2.   #items: array:1 [▼
    3.     0 => User {#572 ▼
    4.       #fillable: array:3 [▶]
    5.       #hidden: array:2 [▶]
    6.       #connection: "mysql"
    7.       #table: null
    8.       #primaryKey: "id"
    9.       #keyType: "int"
    10.       +incrementing: true
    11.       #with: []
    12.       #withCount: []
    13.       #perPage: 15
    14.       +exists: true
    15.       +wasRecentlyCreated: false
    16.       #attributes: array:10 [▶]
    17.       #original: array:10 [▼
    18.         "id" => 1
    19.         "name" => "DimaK"
    20.         "email" => "dima@yandex.ru"
    21.         "email_verified_at" => null
    22.         "password" => "$2y$10$iPrse1TeMPaZ9Q19wpyZveNW.EXNIiV3RDx.QpHVGR4FwkFEiYmSG"
    23.         "remember_token" => "UBS9XPcx7Q0n8E5qFc3W0vhhbFw8LY9MCz10hiR6Q374e1mItVEVOxz5ro8a"
    24.         "created_at" => "2018-09-25 07:26:24"
    25.         "updated_at" => "2018-09-30 16:56:26"
    26.         "avatar" => "uploads/users/ava.png"
    27.         "description" => "2222"
    28.       ]
    29.       #changes: []
    30.       #casts: []
    31.       #dates: []
    32.       #dateFormat: null
    33.       #appends: []
    34.       #dispatchesEvents: []
    35.       #observables: []
    36.       #relations: array:1 [▼
    37.         "city" => Collection {#670 ▼
    38.           #items: array:1 [▼
    39.             0 => City {#663 ▼
    40.               #connection: "mysql"
    41.               #table: null
    42.               #primaryKey: "id"
    43.               #keyType: "int"
    44.               +incrementing: true
    45.               #with: []
    46.               #withCount: []
    47.               #perPage: 15
    48.               +exists: true
    49.               +wasRecentlyCreated: false
    50.               #attributes: array:4 [▼
    51.                 "id" => 4019
    52.                 "country_id" => 3159
    53.                 "region_id" => 3994
    54.                 "name" => "Сыктывкар"
    55.               ]
    56.               #original: array:6 [▼
    57.                 "id" => 4019
    58.                 "country_id" => 3159
    59.                 "region_id" => 3994
    60.                 "name" => "Сыктывкар"
    61.                 "pivot_user_id" => 1
    62.                 "pivot_city_id" => 4019
    63.               ]
    Город вывожу так

    PHP:
    1. //dd($user[0]->city[0]->name);
     
  17. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    --- Добавлено ---
    hasOne = city hasMany = cities
     
  18. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @nospiou first тоже самое,что и 0
     
  19. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    убирает 0 в $user[0]
    для city[0] вторая строка