获取 Laravel 中不同关联关系的最新记录

3

I have 3 Tables

Model Url

class Url extends Model
{
    public function users(){
        return $this->belongsToMany(User::class);
    }
    public function url_status(){
        return $this->hasMany(UrlStatus::class);
    }
}

模型 UrlStatus

class UrlStatus extends Model
{
    public function url()
    {
        return $this->belongsTo(Url::class);
    }
}

模型用户

class User extends Authenticatable
{
    use Notifiable, SoftDeletes, HasRoles;
    public function urls(){
        return $this->belongsToMany(Url::class);
    }
}

在我的控制器中,我正在查询:

$url = Url::with('url_status','users')->where('list_status', true)->get();

我该如何获取最新的url_status?

编辑 ---

这是我的迁移文件中每个表的结构:

URLS表格

 Schema::create('urls', function (Blueprint $table) {
            $table->increments('id');
            $table->string('url');
            $table->string('description');
            $table->boolean('list_status');
            $table->timestamps();
        });

URL 状态

Schema::create('url_status', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('url_id');
            $table->integer('status_code');
            $table->string('status');
            $table->boolean('sms');
            $table->boolean('email');
            $table->timestamps();
        });

用户表

Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('contacts');
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
            $table->softDeletes();
        });

“_latest_”是什么意思?基于什么?id还是date或者其他? - Zakaria Acharki
按照列“created_at”排序日期 - Beginner
查询多个 Url 模型并首先附加每个模型的 UrlStatus 模型并不会真正为您获取最新的 UrlStatus 模型。直接查询 UrlStatus,使用 latest,然后附加 Url 可能更有意义。或者先运行一个 join 并按 url_status.created_at, DESC 排序。 - Tim Lewis
2个回答

14

你也可以尝试这样做

模型网址

public function latestUrlStatus(){
    return $this->hasOne(UrlStatus::class)->latest();
}

像这样获取它

$urls = Url::with('latestUrlStatus','users')->where('list_status', true)->get();
foreach($urls as $url){
    echo $url->latestUrlStatus->status_code;
}

3
尝试使用 latest() 方法和 first() 结合使用,例如:
$url = Url::with('url_status','users')->where('list_status', true)->whereHas('url_status', function($q){
     $q->latest()->first();
})->get();

如果您想获取特定URL的最新url_status,可以像下面这样操作:
$url->url_status->latest()->first();

SQLSTATE[42S22]: 列未找到: 1054 在 'where clause' 中未知的列 'urls.id' (SQL: select * from url_status where urls.id = url_status.url_id order by created_at desc limit 1) - Beginner
你应该检查一下你的关系,因为 url_status 属于 url,它肯定应该包含 url_id 字段。 - Zakaria Acharki
whereHas 用于查询关系是否存在,不影响贪婪加载。 - Devon
我认为你需要每个$url的最新URL状态,如果是这样,请查看我的更新@Beginner。 - Zakaria Acharki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接