Laravel雄辩地从关系中获取数据



我有Task模型。我的Task模型有一些关系,它目前看起来像这样:

class Task extends Model
{
use HasFactory;
public $timestamps = false;
public function city()
{
return $this->hasOne(City::class, 'id', 'city_id');
}
public function type()
{
return $this->hasOne(Type::class, 'id', 'type_id');
}
public function note()
{
return $this->hasOne(Note::class, 'id', 'note_id');
}
public function operator()
{
return $this->hasOne(User::class, 'id', 'operator_id');
}
}

现在,在我的TasksController中,我需要得到符合某些标准的任务,像这样:

$tasks = Task::whereCityId($city->id)->whereTypeId($type->id)->get()->toArray();

问题是命名为city_idtype_idnote_idoperator_id的字段将获得他们拥有的integer值。

相反,我想从相关的模型中获得一定的值。

例如:

operator_id应替换为用户id对应的User表中的username

一个明显的解决方案,这将是简单地使用foreach循环,通过我的结果,得到我需要的数据,简单地创建另一个数组的信息替换,但我不确定这是否是最好的主意,也许有更好的东西。

你必须改变你的代码:

$this->hasOne(ClassName::class, 'id', 'foreign_key');

$this->belongsTo(ClassName::class, 'foreign_key', 'id');

,因为Task的id在这些表中不能作为外键使用。这些表的id作为外键出现在任务表中所以必须使用belongsTo()关系告诉脚本这些id属于哪里。

然后这样访问属性:

$tasks = Task::with("type", "city", "operator")
->whereCityId($city->id)->whereTypeId($type->id)->get();
foreach($tasks as $task){
echo $task->city->name;
}

首先你应该修复你的关系:

public function city()
{
return $this->hasOne(City::class,'city_id','id'); 
}

和一个相同的错误,外键在参数顺序上出现在主键之前。

之后可以使用addSelect:

$tasks = Task::whereCityId($city->id)->whereTypeId($type->id)
->addSelect(['userName' => User::select('name')
->whereColumn('users.id', 'tasks.operator_id')
->limit(1)])->get()->toArray();

我认为这比你要求的更有帮助。

$tasks = Task::whereCityId($city->id)
->whereTypeId($type->id)
->with('operator')
->get()->toArray();

with('operator')是ORM特性,它使集合包含它的关系作为集合属性。在本例中,它将转换为数组属性。

你可以通过foreach

函数访问

@foreach($task as $key)
$key['operator']['username']
@endforeach

祝你过得愉快

相关内容

  • 没有找到相关文章

最新更新