Codeigniter 4 построитель запросов mysql получает подданные от самого себя

[ОБНОВЛЕНО]

ошибка теперь исчезла, но все данные, полученные в результате построителя запросов codeigniter 4, имеют одинаковое значение id, в отличие от значения в phpmyadmin. и если я использую метод $builder, он теперь дает ожидаемый результат, но я все еще надеюсь, что смогу полностью использовать построитель запросов, если это возможно.


У меня есть таблица mysql, как это

id | nama | hari
-----------------
1  | AAA  | 1
2  | AAA  | 2
3  | AAA  | 3
4  | AAA  | 4
5  | AAA  | 5
6  | BBB  | 1
7  | BBB  | 2
8  | BBB  | 3

когда я получаю параметр id 1, я хочу получить только строку с номерами 1-5. он работает, когда я использую этот sql в phpmyadmin

select m.* 
from m_rute m
join (
    select m1.*
    from m_rute m1
    where m1.id = 1
) mt on mt.nama_rute = m.nama_rute

Codeigniter 4 построитель запросов mysql получает подданные от самого себя

затем я пытаюсь «перевести» его с помощью построителя запросов codeigniter 4, но когда я тестирую его на почтальоне, он дает набор данных, в котором все поля id одинаковы, в отличие от результата phpmyadmin.

контроллер

public function show($id = null)
{
    $db = \Config\Database::connect();
    $builder = $db->table('m_rute as m');
    $builder->select('m.*')->where('m.id', $id);
    $subquery = $builder->getCompiledSelect();

    // this works but wouldn't a fully proper query builder seem nicer?
    //////////////
    // $builder->select('m.*')
    //     ->join('('.$subquery.') as m1', 'm1.nama_rute = m.nama_rute')
    //     ;
    // $q = $builder->get();
    // $data = $q->getResultArray();

    $model = new MRuteModel();

    $model->join('('.$subquery.') as t', 't.nama_rute = m_rute.nama_rute');

    $data  = $model->findAll();

    if (!$data) {
        return $this->failNotFound('Data not found');
    }

    return $this->respond($data);
}

любая помощь приветствуется

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение 1. Использование Необработанные/обычные запросы.

The query() function returns a database result object when “read” type queries are run which you can use to show your results. When “write” type queries are run it simply returns true or false depending on success or failure.

<?php

namespace App\Models;

use CodeIgniter\Model;

class MRuteModel extends Model
{
    public function findById(int $id)
    {
        $id = $this->db->escape($id);

        return $this->db->query("
            select m.* 
            from m_rute m
                join (
                    select m1.*
                    from m_rute m1
                    where m1.id = {$id}
                ) mt on mt.nama_rute = m.nama_rute")->getResultArray();
    }
}

Решение 2A. Использование SQL-соединения с необработанными запросами.

join($table, $cond[, $type = ''[, $escape = null]])
   Parameters:

      $table (string) – Table name to join

      $cond (string) – The JOIN ON condition

      $type (string) – The JOIN type

      $escape (bool) – Whether to escape values and identifiers

   Returns:BaseBuilder instance (method chaining)

   Return type:BaseBuilder

Adds a JOIN clause to a query.

<?php

namespace App\Models;

use CodeIgniter\Model;

class MRuteModel extends Model
{
    public function findById(int $id)
    {
        $id = $this->db->escape($id);

        return $this->db->table('m_rute m')
            ->select("m.*")
            ->join("
            (select m1.*
                from m_rute m1
                    where m1.id = {$id}
            ) mt", 'mt.nama_rute = m.nama_rute')
            ->get()->getResultArray();
    }
}

Решение 2B. Использование SQL-соединения с построителем запросов.

getCompiledSelect()

Compiles a SELECT statement and returns it as a string.

<?php

namespace App\Models;

use CodeIgniter\Model;

class MRuteModel extends Model
{
    public function findById(int $id)
    {
        $subQuery = $this->db->table('m_rute m1')
            ->select("m1.*")
            ->where("m1.id", $id)
            ->getCompiledSelect();

        return $this->db->table('m_rute m')
            ->select("m.*")
            ->join("($subQuery) mt", 'mt.nama_rute = m.nama_rute')
            ->get()
            ->getResultArray();
    }
}

Решение 3A. Использование where Пункт с замыканием.

where($key[, $value = null[, $escape = null]])
   Parameters:

      $key (mixed) – Name of field to compare, or associative array

      $value (mixed) – If a single key, compared to this value

      $escape (bool) – Whether to escape values and identifiers

   Returns:BaseBuilder instance (method chaining)

   Return type:BaseBuilder

Generates the WHERE portion of the query. Separates multiple calls with AND.

<?php

namespace App\Models;

use CodeIgniter\Model;
use CodeIgniter\Database\BaseBuilder;

class MRuteModel extends Model
{
    public function findById(int $id)
    {
        // With a closure.
        return $this->db->table('m_rute')
            ->where('nama_rute =', function (BaseBuilder $builder) use ($id) {
                return $builder->select("nama_rute")->from("m_rute")
                    ->where("id", $id);
            })
            ->get()
            ->getResultArray();
    }
}

Решение 3B. Использование where Пункт с Builder.


<?php

namespace App\Models;

use CodeIgniter\Model;

class MRuteModel extends Model
{
    public function findById(int $id)
    {
        $subQuery = $this->db->table('m_rute m1')
            ->select("m1.nama_rute")
            ->where("m1.id", $id)
            ->getCompiledSelect();

        // With a builder.
        return $this->db->table('m_rute')
            ->where("nama_rute =($subQuery)")
            ->get()
            ->getResultArray();
    }
}

Другие вопросы по теме