• Как вычислить разрешение экрана?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    x * y = 4608000
    x2 + y2 = [6.73 * 522]2 = 12341169

    y = 4608000 / x
    x2 + 46080002 / x2 = 12341169

    x4 - 12341169 * x2 + 21233664000000 = 0
    D = 123411692 - 4 * 21233664000000 = 67369796286561
    x2 = (12341169 + sqrt(D)) / 2 = 10274539
    x = 3205.392, y = 1437.578

    Дальше можно посмотреть ближайшие стандартные разрешения и выбрать подходящее.
    Ответ написан
    1 комментарий
  • Laravel Relationships, не использовать left join, как заменить?

    neuotq
    @neuotq
    Прокрастинация
    Это классическая проблема N+1 запроса: при обращении к БД делаем лишних N запросов, хотя можно обойтись одним сразу.
    В Laravel она возникает из-за ленивой загрузки отношений по умолчанию, те при выборке данных модели из БД, отношения не выбираются. Чтобы этого избежать используется with (и его "друзья").
    //Выбрали все посты, данные только по ним
    $posts = Post::orderBy('created_at', 'desc')->limit(20)->get();
    foreach( $posts as $post )
    {
    //обращение к БД за данными по отношению user
      print_r($post->user);
    }
    
    //Два запроса
    // 1.Выбрали все посты, данные только по ним
    // 2. ПО айдишкам из данных таблицы постов, выбрали сразу все нужные из user
    $posts = Post::orderBy('created_at', 'desc')->with('user')->limit(20)->get();
    foreach( $posts as $post )
    {
    //обращение к БД за данными по отношению user НЕ происходит, данные уже есть и скомпонованы
      print_r($post->user);
    }

    Советую читать документацию,
    так же самые распространенные подводные камни с N+1 https://laravel-news.com/laravel-n1-query-problems
    Ответ написан
    1 комментарий
  • Laravel Relationships, как получить запись связывания?

    delphinpro
    @delphinpro Куратор тега Laravel
    frontend developer
    Если хотите меньше писать, то называйте таблицы правильно.
    Связующие таблицы состоят из названий связываемых таблиц в единственном числе в алфавитном порядке.

    У вас она должна называться category_post и содержать минимум два столбика unsignedBigInteger
    post_id | category_id

    Модели должны быть названы в единственном числе Category и Post

    Отношения тоже следует называть соответственно. Тут интуитивно просто: если связь ко многим – множественное число (для отношений hasMany, belongsToMany), иначе единственное (для отношений hasOne, belongsTo).

    Методы всегда называются в camelCase. Первая буква маленькая.

    Только тогда у вас будет работать вся магия ларавел по умолчанию, без дополнительных описаний. Например, не нужно будет указывать таблицу в модели (protected $table = 'categories';)

    -------

    Например, Пользователь и Пост. У каждого пользователя может быть множество постов, но каждый пост принадлежит единственному пользователю. Тогда мы можем описать эту связь так (связь будет один-ко-многим)

    class User {
      public function posts(): HasMany {
        return $this->hasMany(Post::class); // юзер->имеетМного(Постов)
      }
    }
    class Post {
      public function user(): BelongsTo {
        return $this->belongsTo(User::class); // пост->относитсяК(Юзеру)
      }
    }
    
    // Получение данных
    
    foreach ($user->posts as $post) {
       // Все посты пользователя
    }
    
    $post->user->name; // Имя пользователя, которому принадлежит этот пост.
    
    // Добавление постов
    
    $user->posts()->create([ 
      'title' => 'Title of post',
      'content' => 'Long content',
      // id юзера в такой записи указывать не нужно, он будет проставлен автоматически.
    ]);


    ---------

    Теперь к вашему случаю. Тут нужно понять могут ли ваши посты одновременно находиться в нескольких категориях. Если нет, то вам нужна связь один-ко-многим, как в примере выше.
    Если да, то вы на верном пути, вам нужна связь многие-ко-многим, через связующую таблицу.
    Дальнейший код в примерах написан с учетом приведенных выше замечаний по именованию.

    class Post extends Model
    {
        public function categories(): BelongsToMany
        {
          return $this->belongsToMany(Category::class); // пост->относитсяКоМногим(Категориям)
        }
    }
    
    class Category extends Model
    {
        public function posts(): BelongsToMany
        {
          return $this->belongsToMany(Post::class); // категория->относитсяКоМногим(Постам)
        }
    }


    Это всё, что нужно для связи.

    Получить все посты из категории

    foreach ($category->posts as $post) {
    
    }


    C сортировкой

    $posts = $category->posts()->orderBy('created_at')->get();


    Для создания есть те же методы create(), save().
    Кроме того, есть возможность присоединить уже существующую модель.

    $post = Post::create([...]); // Создали пост, он никому не принадлежит
    $category->attach($post->id); // Теперь он связан с категорией


    Есть метод sync() для синхронизации пачки моделей.

    Всё это очень подробно написано в официальной документации.
    Я по сути просто сделал небольшую выжимку оттуда.
    https://laravel.com/docs/10.x/eloquent-relationships
    Ответ написан
    1 комментарий
  • Laravel проверить есть ли запись в избранном, как решить проблему?

    iMedved2009
    @iMedved2009
    Не люблю людей
    Вы left join должны ограничивать при присоединении - а не в where.

    $user = Auth::user();
    DB::table('book')
        ->select('book.*')
        ->where([
            ['book.country', '=', $country->id],
            ['book.city', '=', 0],
            ['book.approve', '=', 1],
        ])
        ->when($user, function($query, $user)
        {
        	  $query->leftJoin('favorite', function($query) use($user){
                     $query->whereColumn('book.id', 'favorite.radio_id')->where('favorite.user_id', '=', $user->id);
              })->addSelect('favorite.id as favorite_checked');
    
        })
        ->paginate(50);


    P.S. А модели вы почему не используете?
    Ответ написан
    6 комментариев