znck / belongs-to-through
v2.11.2
2021-08-19 18:23 UTC
Requires
- php: ^7.3|^8.0
- illuminate/database: ^8.0
Requires (Dev)
- phpunit/phpunit: ^9.3
- scrutinizer/ocular: ^1.8
README
介绍
此 HasManyThrough
的反向版本允许使用无限中间模型进行 BelongsToThrough
关系。
支持 Laravel 5.0+。
安装
composer require staudenmeir/belongs-to-through:"^2.5"
如果您在 Windows 的 PowerShell 中(例如在 VS Code 中),请使用此命令
composer require staudenmeir/belongs-to-through:"^^^^2.5"
使用方法
考虑此 HasManyThrough
关系
Country
→ has many → User
→ has many → Post
class Country extends Model { public function posts() { return $this->hasManyThrough('App\Post', 'App\User'); } }
在您的模型中使用 BelongsToThrough
特性来定义反向关系
Post
→ belongs to → User
→ belongs to → Country
class Post extends Model { use \Znck\Eloquent\Traits\BelongsToThrough; public function country() { return $this->belongsToThrough('App\Country', 'App\User'); } }
您还可以定义更深层的关系
Comment
→ belongs to → Post
→ belongs to → User
→ belongs to → Country
将中间模型数组作为第二个参数提供,从相关(Country
)到父模型(Comment
)
class Comment extends Model { use \Znck\Eloquent\Traits\BelongsToThrough; public function country() { return $this->belongsToThrough('App\Country', ['App\User', 'App\Post']); } }
您可以将自定义外键作为第五个参数指定
class Comment extends Model { use \Znck\Eloquent\Traits\BelongsToThrough; public function country() { return $this->belongsToThrough( 'App\Country', ['App\User', 'App\Post'], null, '', ['App\User' => 'custom_user_id'] ); } }
表别名
如果您的关联路径包含相同的模型多次,您可以指定一个表别名(Laravel 6+)
class Comment extends Model { use \Znck\Eloquent\Traits\BelongsToThrough; public function grandparent() { return $this->belongsToThrough( 'App\Comment', 'App\Comment as alias', null, '', ['App\Comment' => 'parent_id'] ); } }
在您正在别名的模型中使用 HasTableAlias
特性
class Comment extends Model { use \Znck\Eloquent\Traits\HasTableAlias; }
软删除
默认情况下,软删除的中间模型将从结果中排除。使用 withTrashed()
包括它们
class Comment extends Model { use \Znck\Eloquent\Traits\BelongsToThrough; public function country() { return $this->belongsToThrough('App\Country', ['App\User', 'App\Post']) ->withTrashed('users.deleted_at'); } } class User extends Model { use SoftDeletes; }
贡献
有关详细信息,请参阅 CONTRIBUTING 和 CODE_OF_CONDUCT