znck/belongs-to-through

此包已被弃用且不再维护。作者建议使用 staudenmeir/belongs-to-through 包。

Laravel Eloquent BelongsToThrough 关系

资助包维护!
paypal.me/JonasStaudenmeir

安装: 223 165

依赖: 2

建议者: 0

安全: 0

星标: 602

观察者: 17

分支: 50

v2.11.2 2021-08-19 18:23 UTC

README

CI Code Coverage Scrutinizer Code Quality Latest Stable Version Total Downloads License

介绍

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;
}

贡献

有关详细信息,请参阅 CONTRIBUTINGCODE_OF_CONDUCT

致谢