Home >Backend Development >PHP Tutorial >Laravel model relationship setting sub-table
This article mainly introduces you to the relevant information about setting up sub-tables between Laravel models. The article introduces it in great detail through sample code. It has certain reference learning value for everyone's study or work. Friends who need it can follow Let’s learn together with the editor.
What is Eloquent
Eloquent is an ORM, the full name is Object Relational Mapping, translated as "object relational mapping" (if you only refer to it It would be too underestimated to regard it as Database Abstraction Layer array library abstraction layer). The so-called "object" is what this article calls "Model"; object relationship mapping is the relationship between models. Chinese document: http://laravel-china.org/docs/eloquent#relationships
Reference
In actual development Sub-databases and tables are often used. For example, the user table is divided into 100 tables. At this time, querying data requires setting up sub-tables. For example, Laravel's Model class provides the setTable method:
/** * Set the table associated with the model. * * @param string $table * @return $this */ public function setTable($table) { $this->table = $table; return $this; }
Then to add, delete, modify, and query the data table, you need to create a new model instance first, and then set the table name. For example:
(new Circle())->setTable("t_group_" . hashID($userid, 20)) ->newQuery() ->where('group_id', $request->group_id) ->update($attributes);
This is very simple, so how to set up sub-tables when the relationship between models such as HasOne, HasMany, etc. uses this method?
I haven’t found a good solution after searching for a long time. Taking HasOne as an example, I looked at the implementation method of the HasOne function of the Model class. There is no place to set the table name, so I have to copy the HasOne method and modify it. For example, change it to myHasOne, add the $table parameter to set the table name, and call setTable after the object is instantiated, and it will work as expected.
The code is as follows:
public function detail() { return $this->myHasOne(Circle::class, 'group_id', 'group_id', 't_group_' . hashID($this->userid, 20)); } public function myHasOne($related, $foreignKey = null, $localKey = null, $table) { $foreignKey = $foreignKey ?: $this->getForeignKey(); $instance = (new $related)->setTable($table); $localKey = $localKey ?: $this->getKeyName(); return new HasOne($instance->newQuery(), $this, $instance->getTable() . '.' . $foreignKey, $localKey); }
I don’t know if you have a more elegant way.
Related recommendations:
Laravel’s method of loading third-party class libraries
##laravel framework’s implementation of the search function
The above is the detailed content of Laravel model relationship setting sub-table. For more information, please follow other related articles on the PHP Chinese website!