Спасибо, в целом таких WhenUserChanged будет много с разными интерфейсами и использоваться этот WhenUserChanged будет в нескольких местах, поэтому хотелось один раз создать дженериком интерфейс и использовать его.
jazzus, действительно, все заработало, спасибо.
Моя задача совсем не про книги и комментарии, ее сделал для показа аналогии сути проблемы, так что скриншотов и кода было бы много :)
А проблема была, что на модели я использовал protected $visible, куда не включил новое отношение, поэтому comments в нашей задаче не подставлялись :)
Раз такое дело пошло, вы случайно не в курсе, как красиво переименовать некоторые столбцы в результирующем ответе? Результат всего этого запроса отдается как ответ API сконвертированный в JSON.
Но нужно чтобы поле с текстом комментария называлось не comments, а, например, userComments. Я вижу тут вариант только map'ать результат и менять вручную названия полей на нужные. Но может есть готовое красивое решение?
jazzus, вроде как удалось прописать отношение, но в результирующей выборке отсутствуют comments.
Хотя, если смотреть отладчик, необходимый SQL запрос отсылается и если этот запрос выполнить самостоятельно, то он возвращает нужные комментарии. Но в итоговом объекте после выполнения orm запроса комментарии не появляются.
jazzus, надо ли прописывать в какую-то модель отношение для comments?
Насколько я понимаю, надо прописать отношение comments belongsToMany для модели Book. Но как-то там не клеится особо.
Пожалуйста, не могли бы ли вы пояснить немного подробнее?
hasManyThrough я добавляю в модель User и больше никаких отношений в других моделях не нужно указывать?
Rsa97, я это понимаю. Поэтому и говорю, что абстрактно представим, что возможно в такую ситуацию попасть, то выполнился ли бы там сначала лог из таймаута и только потом лог из промиса?
Rsa97, по-хорошему, ниоткуда. Поэтому я и говорю, что если абстрактно на минуту представить, что выполнение кода скрипта идет вне какой-то таски, и очередь тасок от этого пуста, но setTimeout создаст макротаску и промис микротаску, то на следующей итерации эвентлупа setTimeout в нее пойдет первым и выполнится первым и только затем, в той же итерации эвентлупа следующим выполнится промис?
Rsa97 , tehfreak Я ведь правильно понимаю, если бы мой код абстрактно вырвать из эвентлупа и из таски, в которой он выполняется и запустить его с нуля в свежем эвентлупе, то выполнится сначала setTimeout (отбросим то, что он выполняется с задежкой 4мс), а затем выполнится промис?
Вот это похоже на правду. Просто этот момент, что начальный код это тоже таск, я как-то не находил ни в каких объяснениях. Обычно, люди всегда говорят, что микротаски выполняются первыми, а затем макротаски. На деле же это не так ведь.
Мне просто кажется, что все упускают момент, что текущий код это тоже макротаск. Если бы код не был макротаском а был бы где-то вне эвентлупа, то setTimeout отработал бы первым, а затем отработал бы промис.
tehfreak, я когда пишу таск, я подразумеваю макротаск. В псевдокоде тоже, task это макротаск. Но вы же сами сказали, сообщением выше, что сначала выполняются микротаски, а потом макротаски. Хотя по хорошему, должно быть наоборот, а сейчас вы вроде как согласились, что сначала выполняется макротаск, а затем микротаски. Где правда та? :)
tehfreak, а почему тогда и в докладе по ссылке в вопросе и в визуализаторе эвентлупа план выполнения показа иначе: сначала таски, потом микротаски?
Я могу предположить, что план у них верный, просто когда выполняется сам код скрипта это и есть очередная таска, естественно, если в ней создавать микротаску, то она выполнится сразу же, а если макротаску, то при следующих итерациях эвентлупа, когда до нее очередь дойдет. И тогда и план выполнения верный и объясняется почему при первой итерации эвентлупа якобы пропускается первая таска: потому что сейчас и так таска выполняется.
Может быть на самом деле так?
Алексей Абрамов, если брать за правду, что псевдокод эвентлупа из моего вопроса верный в момент старта выполнения скрипта очередь тасков и микротасков пуста, то обе ссылки с визуализатором эвентлупа должны сначала выводить результат setTimeout, а затем результат промиса.
Статью на learn.javascript я читал, спецификацию по эвентлупу тоже начал читать, но пока не нашел ответа. Получается, что приведенный мною псевдокод эвентлупа неверный и в нем на первом месте должно идти выполнение микротасков, а затем макротасков?
Алексей Абрамов, я в курсе. Я привел пример псевдо кода эвентлупа, который как раз эти таски и микротаски запускает. В нем видно, что сначала выполняются таски, а затем микротаски.
0xD34F, хочу еще поинтересоваться. Если бы именно вы решали эту задачу, вы бы выбрали вариант с inject или, например, добавили бы taskId в каждый variant или еще как-нибудь?
Ankhena, а если тело будет побольше, чем просто color: цвет, а количество ключей массива не 2, а 10? Без разницы это не вариант. Интересует как это можно сделать возможностями языка.