CodeIgniter中如何将关联表的player_id转为对象以支持Twig层级调用?
在CodeIgniter中实现关联表数据的对象式调用
当然可行啦!你现在遇到的问题是因为直接查询statistics表只拿到了player_id这个字符串,没有关联到players表的具体数据。下面给你几种实用的解决办法,让你能在Twig里轻松用{{ stat.player.name }}这种方式调用:
方法一:用SQL JOIN一次性查询关联数据(高效推荐)
这种方法通过JOIN把两张表的数据合并查询,避免多次数据库请求,适合数据量较大的场景。在你的模型里写一个查询方法:
public function get_statistics_with_players() { // 选择statistics的所有字段,以及players里你需要的字段 $this->db->select('statistics.*, players.id as player_id, players.name, players.age'); $this->db->from('statistics'); // 左连接players表,确保即使没有对应player的统计数据也能返回 $this->db->join('players', 'players.id = statistics.player_id', 'left'); $query = $this->db->get(); $results = []; foreach ($query->result_array() as $row) { // 把player相关字段打包成子数组,模拟对象结构 $row['player'] = [ 'id' => $row['player_id'], 'name' => $row['name'], 'age' => $row['age'] ]; // 移除重复的字段,避免混淆 unset($row['name'], $row['age']); $results[] = $row; } return $results; }
调用这个方法后,返回的每个统计项里都会包含player子数组,在Twig里就能直接用{{ stat.player.name }}来访问球员名称了。
方法二:通过模型关联查询(适合小数据量)
如果你的数据量不大,可以先查所有统计数据,再逐个关联对应的球员信息。首先创建一个Players_model:
class Players_model extends CI_Model { // 根据ID获取单个球员信息 public function get_player_by_id($player_id) { return $this->db->get_where('players', ['id' => $player_id])->row_array(); } }
然后在统计模型里调用这个方法:
public function get_all_statistics() { // 先获取所有统计数据 $statistics = $this->db->get('statistics')->result_array(); // 加载球员模型 $this->load->model('Players_model'); // 给每个统计项添加关联的球员数据 foreach ($statistics as &$stat) { $stat['player'] = $this->Players_model->get_player_by_id($stat['player_id']); } return $statistics; }
这种方法逻辑简单,但要注意:如果有100条统计数据,就会发起101次数据库请求(1次查统计+100次查球员),数据量大的时候性能会受影响。
方法三:CodeIgniter 4的关联模型(如果用CI4的话)
如果你用的是CodeIgniter 4,框架自带了更强大的关联支持。先定义两个模型:
Player模型
namespace App\Models; use CodeIgniter\Model; class Player extends Model { protected $table = 'players'; protected $primaryKey = 'id'; }
Statistics模型
namespace App\Models; use CodeIgniter\Model; class Statistics extends Model { protected $table = 'statistics'; protected $primaryKey = 'id'; // 定义关联:一条统计数据属于一个球员 public function player() { return $this->belongsTo(Player::class, 'player_id'); } }
然后查询的时候直接带上关联:
$this->load->model('App\Models\Statistics'); $statistics = $this->Statistics->with('player')->findAll();
返回的结果里player就是一个对象,在Twig里直接用{{ stat.player.name }}完全没问题,非常省心。
小提示
不管用哪种方法,建议在Twig里加个判断,避免当player_id没有对应球员时出现错误:
{% if stat.player %} 球员名称:{{ stat.player.name }} {% else %} 无对应球员 {% endif %}
内容的提问来源于stack exchange,提问作者Patrick Rey
相关产品推荐
相关产品推荐

