Home >Backend Development >PHP Tutorial >Laravel model relationship setting sub-table

Laravel model relationship setting sub-table

不言
不言Original
2018-04-21 14:11:092123browse

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn