В настоящее время в CI2 вы не можете получить доступ к методу Query Builder ($ this-> db -> _ compile_select ()) класса Database, не расширяя класс Database и не изменяя тип доступа метода с private на public / protected, что убивает способность создавать подзапросы так же, как вы пытаетесь построить с помощью класса ActiveRecord. Единственный способ создать подзапрос, подобный тому, который вы пытаетесь построить, - это просто использовать метод запроса db
$table = $this->db->dbprefix('tablename');
$sql = "SELECT * FROM `{$table}` WHERE field1='?' AND (field2='?' OR field3='?') ";
$this->db->query($sql,array($field1,$field2,$field3));
. В блоге CI Subquerys было сообщение об этом, но он устарел и работает только на CI 1.7 Надеюсь, это немного поможет.
Чтобы расширить то, что сказал Лассе (или, скорее, сделать его немного более явным).
Поскольку 0 может быть преобразован в тип Enum,
0 - endDate.DayOfWeek becomes
(DayOfWeek)0 - endDate.DayOfWeek
И поскольку вы можете вычесть одно перечисление из другого и получить целочисленную разницу :
(DayOfWeek)0 - endDate.DayOfWeek == (int)endDate.DayOfWeek
Таким образом, поскольку результатом вычитания является int, вы можете добавить к нему 7.
endDate.AddDays(0-endDate.DayOfWeek + 7);
Итак, если значение Enum понедельника равно 1
0 - endDate.DayOfWeek == -1 + 7 == 6
Однако вы не можете сделать обратное.
endDate.DayOfWeek - 0 + 7,
, поскольку тип результата вычисления зависит от крайней левой части. Таким образом, в то время как 0 - endDate.DayOfWeek дает целое число, endDate.DayOfWeek - 0 приводит к перечислению DayOfWeek.
Что наиболее интересно, вы можете использовать этот побочный эффект для получения значения перечисления без преобразования типов, хотя я бы Считайте это хакерским и запутанным ... так что следует избегать.
int enumValue = -(0 - endDate.DayOfWeek);
Это очень интересно. Правильный способ сделать это:
endDate.AddDays(7 - (int)endDate.DayOfWeek);
Но ваш вопрос не о решении, а о причине поведения. Это как-то связано с тем, как компилятор обрабатывает ноль. Любая линия не работает, если нет нуля, в то время как обе линии работают, если есть ноль.
Вы можете вычесть два значения перечисления, чтобы получить их целочисленную разницу значений:
using System;
namespace ConsoleApplication10
{
public enum X { A, B, C, D }
public class Program
{
static void Main()
{
var x = X.D + X.A;
Console.Out.WriteLine(x);
Console.In.ReadLine();
}
}
}
Распечатает 3.
Но вы не можете сложить, вероятно, не имеет смысла.
В случай «0», 0 автоматически конвертируется во все типы перечислений, поэтому в основном «0 - enumvalue» означает то же самое, что и «(enumtype) 0 - enumvalue», что снова работает.