-
-
Notifications
You must be signed in to change notification settings - Fork 213
[WIP] Model registry #6248
[WIP] Model registry #6248
Conversation
The database connection is now available from the result, that make it possible to use Models between different database connections.
We definitely have to schedule for a Skype call before I can merge this :) |
Okay, I removed the multi db support for models to avoid critical BC breaks. @leofeyer please have a look at this commit, it is a proposal for the upgrade notice. |
Do we really need to trace the registry in the debug bar? It causes nasty line-breaks on screens <= 1024 pixels. The debug bar has been tracing performance relevant parameters only so far:
How is the registry parameter relevant in this context? |
I really like it, Leo :) Do some responsive work and only show the icons and values without label if the window size is not big enough ;) Should be fairly easy to do, shouldn't it? |
Yes, but I'd also like to see a point in things :) No hard feelings. |
Also, I don't fully understand why there is a |
But now it is possible to use the Collection without a Result object. |
While reviewing the code I found the answer in the public static function findMultipleByIds($arrIds, array $arrOptions=array())
{
if (empty($arrIds) || !is_array($arrIds))
{
return null;
}
$arrRegisteredModels = array();
$arrMissingModelIds = array();
…
return new \Model\Collection(array_filter(array_values($arrRegisteredModels)), static::$strTable);
} An array with models is passed to the constructor, so |
*/ | ||
public function refresh() | ||
{ | ||
// Note: do not check $this->arrModified here to make possible to refresh after low level updated! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Although the note says "do not check $this->arrModified
", you are checking it in the following lines. Is this correct?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The note is correct, but would still be a little concretized.
The following check is for tracing primary key changes. If the PK has changed, the original value (that still exists in the database) in $this->arrModified[static::$strPk]
and not $this->{static::$strPk}
.
…e()` to `mergeRow()`
Feature/model registry develop
Merged in dcd2cd1. Thank you so much for your time and good work. This was one of the biggest pull requests ever :) |
You're welcome :-) |
Thank you as well, @tristanlins... The whole Contao community owes you (and everyone involved) a huge debt of gratitude. Great to see open source in action. |
Continue of #6131 but against develop branch!
In Bezug auf #6070 wie versprochen ein PR für eine Model Registry.
Checklist
Model::save
nur die Änderungen speichernModel::setRow
richtig protokollieren(8) Magic Properties entfernen?! (siehe B)Model::free()
) für händische SpeicheroptimierungModel::refresh()
to reload the data from database.Model
(Drop the Database_Result cache #6182 (comment))Collection
(Drop the Database_Result cache #6182 (comment))Es gibt noch ein paar Punkte, an denen ich zu knabbern habe:
(A) Das erste ist
Model::save(true)
was ja bewirkt, dass ein Model als neuer Record gespeichert wird. Das funktioniert aber in Verbindung mit der Registry ganz schlecht. Das Problem ist halt, dass ich quasi das Objekt re-registrieren müsste, für die neu erstellte ID. Das geht aber ja nicht.Normalerweise sollte ein "Klon" so durchgeführt werden:
Ganz davon abgesehen, dass durch die Registry man das hier natürlich gar nicht mehr machen kann:
Obwohl man
save(true)
gemacht hat, wird hier natürlich der Originaldatensatz mit der ID 1 gleich mit verändert.Lösung: das
$blnForceInsert
wird gedropt. Die__clone
löscht bereits den PK von dem neuen Model, d.h. die richtige Variante mit clone ist bereits implementiert.(B) Die Models werden teilweise mit nicht existierenden Werten befüllt. Ein Beispiel ist
PageModel::findPublishedSubpagesWithoutGuestsByPid
im SELECT werden dort virtuelle Felder erzeugt, die im Model auch verfügbar sind, da dieses ja lediglich auf das Result zugreift. Eigentlich sollte das gar nicht unterstützt werden, um es zu unterstützen mache ich jetzt immer einen Merge mit dem Record, wenn ich ein Model aus der Registry hole. Siehe 35559abLösung: derartige virtuellen Felder dürfen nicht über das Query kommen, sondern müssen über getter des Models kommen.
Es gibt sicher noch ein paar Dinge, die ich gerade auf die schnelle nicht berücksichtigt habe.
Außerdem bin ich ja noch nicht fertig wie man an der Checkliste sehen kann ;-)
Trotzdem ist Feedback erwünscht, ich würde mich vor allem über Feedback von @leofeyer freuen, ob das so akzeptabel ist. Ich setze gerne Änderungswünsche um.