如何在 codeigniter 4 中使用 table 别名?

How to use table alias in codeigniter 4?

我正在尝试在 CitizenModel 中加入宗教和公民 table。问题是 from 语句总是包含 table 公民。

这是模型脚本示例:

<?php

namespace App\Models;
use CodeIgniter\Model;

class CitizenModel extends Model
{
  protected $table = 'citizen';
  protected $primaryKey = 'CitizenID';
  protected $allowedFields = [
    'CitizenID',
    'ReligionId',
    ];
    
  public function getCitizen()
  {
    //$this->distinct();
    $this->select('a.*, b.Name as Religion');
    $this->from("citizen a");
    $this->join('religions b', 'b.ReligionId = a.ReligionId', 'LEFT');

    $result = $this->findAll();
    echo $this->db->getLastQuery();
    return $result;
  }
}

这是最后的查询结果:

SELECT `a`.*, `b`.`Name` as `Religion`
FROM (`citizen`, `citizen` `a`)
LEFT JOIN `religions` `b` ON `b`.`ReligionId` = `a`.`ReligionId`

我在 sqlyog 中测试了查询,但查询结果为

FROM (`citizen`, `citizen` `a`)

不同于

FROM (`citizen` `a`)

除非我在 select 中添加了 DISTINCT。

我认为发生这种情况是因为您实际上设置了两个选择。一个在 $table 属性 中,一个在你的 $this->from 方法中。

在这种情况下我会尝试做的是从中删除 $this-> 并重新编写 $table 属性。像这样:

  public function getCitizen()
  {
    //$this->distinct();
    $this->select('a.*, b.Name as Religion');
    $this->table("citizen a");
    $this->join('religions b', 'b.ReligionId = a.ReligionId', 'LEFT');

    $result = $this->findAll();
    echo $this->db->getLastQuery();
    return $result;
  }

如果这不起作用,您可能希望为该查询使用不同的数据库实例,而不是模型正在使用的数据库实例。使用查询生成器。

public function getCitizen() {
    $db = \Config\Database::connect();
    $builder = $db->table('citizen a');
    $builder->select('a.*, b.Name as Religion');
    $builder->join('religions b', 'b.ReligionId = a.ReligionId', 'LEFT');
    $result = $builder->get()->getResult();
}