#php #database #codeigniter #codeigniter-datamapper
#php #База данных #codeigniter #codeigniter-datamapper
Вопрос:
Я использую DataMapper ORM, и у меня есть следующие таблицы:
channel_providers
==================
id(pk)
name
channels
=========
id(pk)
channel_provider_id(fk)
name
sales_records
==============
id(pk)
channel_id(fk)
customer_name
salesman_name
amount
Что я хотел бы сделать, так это отобразить все строки в таблицах sales_records, включая имя поставщика канала и название канала, но сгруппировать по столбцу name в таблице channel_providers.
В настоящее время у меня есть следующие коды:
$sales_records=new Sales_record();
$sales_records->get();
foreach($sales_records as $sales_record){
$sales_record->channel->get();
$sales_record->channel->channel_provider->get();
//now I can write codes to to echo all data, but the problem is that $sales_records is not grouped by the channel_providers.name column
}
Из примера group_by на этой странице: http://datamapper.wanwizard.eu/pages/get.html
Я знаю, что могу использовать group_by
функцию для столбца, который существует в таблице, с которой связан объект. Но в моем случае столбец, который я хочу использовать, group_by не находится в его собственной таблице, как это можно сделать?
Большое спасибо вам всем.
Ответ №1:
Использование предложения group_by должно сработать, поскольку оно должно автоматически создавать необходимые предложения join для вас, тем самым открывая вам возможность использовать его. Вы действительно пробовали это?
Если это не сработает, вы можете вернуться к базовому стилю активной записи CodeIgniter, для чего-то подобного, перед вашими вызовами get и после создания вашего объекта, поскольку Datamapper просто располагается поверх содержимого базы данных CI:
$this->db->join('channels','channels.id = sales_records.channel_id');
$this->db->join('channel_providers','channel_providers.id = channels.channel_provider_id');
Затем вы должны иметь возможность сгруппировать свои результаты с помощью group_by и получить код из предыдущего:
$sales_record->channel->channel_provider->group_by('channel_providers.name')->get();