Non-stati c метод App \ User :: address () не должен вызываться статически - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь получить все адреса пользователя, вошедшего в систему, для которого я создал связь в адресе модели и пользователя. Любой клиент / пользователь, вошедший в систему, может сохранить несколько адресов и сделать один адрес основным, чтобы эта часть работала, но после сохранения я хочу получить все адреса этого конкретного клиента, поэтому я создал связь. Я пытался получить весь адрес, используя

$userAddress=User::addresses();

, но я получаю

Нестатистический c метод App \ User :: address () не должен быть статически вызываемые адреса

Это моя модель пользователя:

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Hash;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'first_name', 'last_name', 'email', 'password','address_id'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
    * @return string
    */
    public function getFullNameAttribute()
    {
    return $this->first_name. ' '. $this->last_name;
    }

    public function setPasswordAttribute($pass){

        $this->attributes['password'] = Hash::make($pass);

    }

    public function wishlist(){
        return $this->hasMany(Wishlist::class);
    }

    public function addresses(){
        return $this->hasMany(Addresses::class);
    }
}

Модель адреса:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Addresses extends Model
{
     /**
     * @var string
     */
    protected $table = 'addresses';

     /**
     * @var array
     */
    protected $fillable = [
        'name', 'address', 'country', 'state', 'city','address_type','user_id','updated_at'
    ];

    public function user(){
        return $this->belongsTo(User::class);
     }
}

Контроллер продукта :

<?php

namespace App\Http\Controllers\Site;
use App\Contracts\AttributeContract;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Contracts\ProductContract;
use App\Contracts\AddressContract;
use Cart;
use Validator;
use App\User;

class ProductController extends Controller
{ 
    protected $productRepository;
    protected $attributeRepository;
    protected $addressRepository;
    public function __construct(ProductContract $productRepository, AttributeContract $attributeRepository, AddressContract $addressRepository)
{  
    $this->productRepository = $productRepository;
    $this->attributeRepository = $attributeRepository;
    $this->addressRepository = $addressRepository;
}

    public function index()
    {
        $products = $this->productRepository->listFeaturedProduct();
        return view('site.pages.homepage', compact('products'));
    }

public function checkout(Request $request)
{
    $userAddress=User::addresses();
    return view('site.pages.checkout');
}

public function addUserAddress(Request $request)
{
    $customer_name=$request->customer_name;
    $customer_address=$request->customer_address; 
    $country=$request->country; 
    $city=$request->city;
    $zip_code=$request->zip_code;  
    $state=$request->state; 
    $address_type=$request->address_type; 
    $is_primary_address=$request->primary_address; 
    $userID=auth()->user()->id;
    $data=array('name'=>$customer_name,'address'=>$customer_address,'country'=>$country,'state'=>$state,'city'=>$city,'address_type'=>$address_type,'user_id'=>$userID,'is_primary_address'=>$is_primary_address);
    $userAddress  = $this->addressRepository->addAddress($data);
    return redirect()->back()->with('message', 'Address Added');
}

}

1 Ответ

0 голосов
/ 08 марта 2020

Ваше пространство имен пользователя App\User, а пространство имен ваших адресов App\Models\Addresses.

Вам необходимо отредактировать две модели.

Модель пользователя

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Hash;

use App\Models\Addresses; // You are missing this line !!!!

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'first_name', 'last_name', 'email', 'password','address_id'
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
    * @return string
    */
    public function getFullNameAttribute()
    {
    return $this->first_name. ' '. $this->last_name;
    }

    public function setPasswordAttribute($pass){

        $this->attributes['password'] = Hash::make($pass);

    }

    public function wishlist(){
        return $this->hasMany(Wishlist::class);
    }

    public function addresses(){
        return $this->hasMany(Addresses::class);
    }
}

Модель адресов

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\User; // and this line here

class Addresses extends Model
{
     /**
     * @var string
     */
    protected $table = 'addresses';

     /**
     * @var array
     */
    protected $fillable = [
        'name', 'address', 'country', 'state', 'city','address_type','user_id','updated_at'
    ];

    public function user(){
        return $this->belongsTo(User::class);
     }
}

Теперь вы можете использовать отношение для получения адресов одного пользователя

$id = 1;
$adresses = User::find($id)->addresses;
\\ or
$adresses = auth()->user()->addresses;

У меня есть два других замечания:

  • Модель не должна быть во множественном числе, как вы это сделали с Addresses
  • У вас есть опечатка, в английском sh в отличие от французского, в адресе только одна буква D.
  • Вы должны были заметить, что мы не использовали метод напрямую, мы использовали его как атрибут (->addresses вместо ->addresses()), если вы используете метод, вы используете для этого конструктор запросов.
$user->addresses()->get();
\\or
$user->addresses()->latest()->first();
...