Octobercms 组件 - 限制关系结果

Octobercms Component - Limit results on relation

我有一个包含 2 个组件的插件。一个用于 'posts',另一个用于 'profile'。该个人资料属于一个用户并且有许多 'posts'.

然而,当我访问关系时,它每隔 post 加载一次。我只想加载 5 然后分页或延迟加载,我该怎么做?

Profile.php 型号

public $hasMany = [
        'posts' => [
            'Redstone\Membership\Models\Post',
            'table' => 'redstone_membership_profiles_posts',
        ]
    ];

public $belongsTo = [
        'user' => [
            'Rainlab\User\Models\User',
        ]
    ];

Post.php 型号

public $belongsTo = [
        'profile' => ['Redstone\Membership\Models\Profile',
        'table' => 'redstone_membership_profiles_posts',
        ]
    ];

Profile.php分量

protected function loadProfile()
    {
        $id = $this->property('profileUsername');

        $profile = new UserProfile

        $profile = $profile->where(['slug' => $id]);

        $profile = $profile->first();
        return $profile;
    }

profile/default.htm - 组件视图

{% set profile = __SELF__.profile %}
{% set posts = __SELF__.profile.posts %}

 {% for post in posts %}
      <div class="card">
        <div class="card-header">
            <div class="ml-2">
                <div class="h5 m-0">{{ profile.title }}</div>
                  </div>
                  {{ post.published_at|date('M d') }}  
                </div>
              <div class="card-body  text-left">
                    {{ post.content|raw }}
            </div>
        </div>
 {% else %}

 <h1>This user has not made any posts.</h1>

 {% endfor %}

好吧,您可以使用 OctoberCMS pagination service 或 php 函数做一些事情,或者您可以通过 twig 构建一个函数。

PHP 使用 slice:这是假设当您调用 $profile->posts 时您会得到一组帖子。您还可以向 Url 添加查询,例如 example.com/profile?q=15 将 5 更改为 10 15 等 我添加了一个 if 语句来检查以确保输入是数字且大于 5。

protected function loadProfile()
{
    $id = $this->property('profileUsername');

    $profile = UserProfile::where(['slug' => $id])->first();

    if (is_numeric(Input::get('q')) == true && Input::get('q') > 5) {

        $profile->posts = $profile->posts->slice(0, Input::get('q'));

    } else { 

        $profile->posts = $profile->posts->slice(0, 5);

    }

    return $profile;
}

Twig using slice:这与 PHP 的方式非常相似,但在 htm 文件中完成。

PHP -

protected function getQuery() 
{

    if (is_numeric(Input::get('q')) == true && Input::get('q') > 5) {
        return Input::get('q');
    } else {
        return 5;
    }

}

树枝-

{% set query = __SELF__.getQuery %}
{% set profile = __SELF__.profile %}
{% set posts = __SELF__.profile.posts | slice(0, query) %}

 {% for post in posts %}
      <div class="card">
        <div class="card-header">
            <div class="ml-2">
                <div class="h5 m-0">{{ profile.title }}</div>
                  </div>
                  {{ post.published_at|date('M d') }}  
                </div>
              <div class="card-body  text-left">
                    {{ post.content|raw }}
            </div>
        </div>
 {% else %}

 <h1>This user has not made any posts.</h1>

 {% endfor %}