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 setTable. Method:
Recommended tutorial: "laravel tutorial"
/** * 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?
After searching for a long time, I couldn't find a good way. Taking HasOne as an example, I had to copy the HasOne method in the Model class, change it to myHasOne, pass in the table name, and call setTable after the object is instantiated in the function. Sure enough it can.
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.
The above is the detailed content of Detailed explanation of how to set up sub-tables for relationships between Laravel models. For more information, please follow other related articles on the PHP Chinese website!