Надеюсь, я понимаю вашу проблему. Но из того, что я вижу, вы спрашиваете данные друзей и данные пользователей, когда вы делаете 'SELECT friends, myuser
.
Попробуйте только выбрать friends
Примерно так:
SELECT friend FROM AppBundle\Entity\Friends friend INNER JOIN AppBundle\Entity\User user WHERE friend.friendsWithMe = :userId AND friend.status = 1
Тогда в результате у вас будет только массив друзей.
Если проблема не устранена, вы можете добавить fetch = "EAGER", чтобы она не была "LAZY"
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="myfriends", fetch="EAGER")
Разница между временем компиляции и временем выполнения является примером того, что остроумные теоретики называют разделением фаз . Это одна из самых сложных концепций для изучения, особенно для людей без особого опыта в языках программирования. Чтобы подойти к этой проблеме, я считаю полезным спросить
Что может пойти не так, так это ошибки времени выполнения :
Также могут быть ошибки, которые обнаруживает сама программа:
открытый класс RuntimeVsCompileTime {
public static void main(String[] args) {
//test(new D()); COMPILETIME ERROR
/**
* Compiler knows that B is not an instance of A
*/
test(new B());
}
/**
* compiler has no hint whether the actual type is A, B or C
* C c = (C)a; will be checked during runtime
* @param a
*/
public static void test(A a) {
C c = (C)a;//RUNTIME ERROR
}
}
class A{
}
class B extends A{
}
class C extends A{
}
class D{
}
Можно понять структуру компиляции кода от чтения фактического кода. Структура во время выполнения не четка, если Вы не понимаете шаблон, который использовался.
Это плохой вопрос для SO (это не конкретный вопрос программирования), но в целом неплохой вопрос.
Если вы думаете, что это тривиально: как насчет времени чтения или во время компиляции, и когда это полезно различать? А как насчет языков, для которых компилятор доступен во время выполнения? Гай Стил (без пустышки, он же) написал в CLTL2 7 страниц об EVAL-WHEN, которые программисты CL могут использовать для управления этим. Двух предложений едва хватает для определения , которое само по себе далеко от объяснения .
В общем, это сложная проблема, которую разработчики языка, кажется, пытаются избежать. Они часто просто говорят: «Вот компилятор, он делает вещи во время компиляции; все после этого - во время выполнения, получайте удовольствие». C разработан, чтобы быть простым в реализации, а не самой гибкой средой для вычислений. Когда у вас нет компилятора во время выполнения или возможности легко контролировать, когда выражение оценивается, вы, как правило, в конечном итоге используете хаки в языке, чтобы имитировать общее использование макросов, или пользователи придумывают шаблоны проектирования для имитации имея более мощные конструкции. Простой в реализации язык определенно может быть стоящей целью, но это не значит, что это конечная цель проектирования языков программирования. (Я не часто использую EVAL-WHEN, но я не могу представить себе жизнь без него.)
И проблема времени компиляции и времени выполнения огромна и все еще в значительной степени не исследована. Это не значит ТАК это подходящее место для обсуждения, но я призываю людей исследовать эту территорию дальше, особенно тех, кто не имеет предвзятого представления о том, какой она должна быть. Вопрос не простой и не глупый, и мы могли бы, по крайней мере, указать инквизитору в правильном направлении.
К сожалению, я не знаю хороших ссылок на этот счет. CLTL2 немного об этом говорит, но не очень хорошо об этом узнавать.
Время выполнения означает, что что-то происходит, когда вы запускаете программу.
Время компиляции означает, что что-то происходит, когда вы компилируете программу.
Например: В строго типизированном языке тип может быть проверен во время компиляции или во время выполнения. Во время компиляции это означает, что компилятор жалуется, если типы несовместимы. Во время выполнения означает, что вы можете легко скомпилировать свою программу, но во время выполнения выдает исключение.
Хм, хорошо, среда выполнения используется для описания чего-то, что происходит, когда программа работает.
Время компиляции используется для описания того, что происходит при построении программы (обычно, компилятором).
Действия, которые выполняются во время компиляции, не требуют (почти) затрат при запуске результирующей программы, но могут повлечь за собой большие затраты при построении программы.
Более или менее полная противоположность. Меньше затрат при сборке, дороже при запуске программы.
С другой стороны; Если что-то делается во время компиляции, это выполняется только на вашем компьютере, а если что-то во время выполнения, оно выполняется на вашей пользовательской машине.
Примером того, где это важно, может быть тип, несущий модуль. Версия времени компиляции (например, Boost. Единицы или моя версия в D ) в конечном итоге оказываются столь же быстрыми, как и решение проблемы с собственным кодом с плавающей запятой, в то время как во время выполнения версии приходится упаковывать информацию о единицах, которые значение присутствуют и проводят в них проверки при каждой операции. С другой стороны, версии времени компиляции требуют, чтобы единицы значений были известны во время компиляции, и не может справиться со случаем, когда они поступают из ввода времени выполнения.
В основном, если ваш компилятор может определить, что вы имеете в виду или какое значение имеет значение «во время компиляции», он может жестко закодировать это во время выполнения. Очевидно, что если ваш исполняемый код должен выполнять вычисления каждый раз, он будет работать медленнее, поэтому, если вы можете определить что-то во время компиляции, это будет намного лучше.
Например,
Постоянное сворачивание:
Если я напишу:
int i = 2;
i += MY_CONSTANT;
Компилятор может выполнить это вычисление во время компиляции, потому что он знает, что такое 2, и что такое MY_CONSTANT. Таким образом, он избавляет себя от выполнения вычислений при каждом выполнении.
Трансляция исходного кода в происходящее на экране [экран | диск | сеть] может происходить (примерно) двумя способами; назовите их компиляцией и интерпретацией.
В скомпилированной программе (примеры - c и fortran):
Говорят, что то, что происходит на первом этапе, происходит во время "компиляции" ", то, что происходит на втором этапе, называется" во время выполнения ".
В интерпретируемой программе (пример MicroSoft basic (на dos) и python (я думаю)):
Я думаю об этом с точки зрения ошибок и о том, когда они могут быть обнаружены.
Время компиляции:
string my_value = Console.ReadLine();
int i = my_value;
Строковое значение не может быть присвоено переменной типа int, поэтому компилятор точно знает во время компиляции , что этот код имеет проблему
Время выполнения:
string my_value = Console.ReadLine();
int i = int.Parse(my_value);
Здесь результат зависит от того, какая строка была возвращена ReadLine (). Некоторые значения можно преобразовать в int, другие - нет. Это можно определить только во время времени выполнения
( edit : следующее применимо к C # и подобным строго типизированным языкам программирования. Я не уверен, поможет ли это вам).
Например, следующая ошибка будет обнаружена компилятором (в время компиляции ) перед запуском программы и приведет к ошибке компиляции:
int i = "string"; --> error at compile-time
С другой стороны, ошибка, подобная следующей, не может быть обнаружена компилятором. Вы получите сообщение об ошибке / исключении во время времени выполнения (при запуске программы).
Hashtable ht = new Hashtable();
ht.Add("key", "string");
// the compiler does not know what is stored in the hashtable
// under the key "key"
int i = (int)ht["key"]; // --> exception at run-time
Время компиляции: период времени, в течение которого вы, разработчик,