前提:假设你已经懂了构建模块与路由

    {module}/Api/Data下新建对象interface,定义字段和getset方法,要加具体注释
    /*
    @param $id
    @return int
    /

    1. <?php
    2. namespace Training5\VendorRepository\Api\Data;
    3. interface VendorInterface
    4. {
    5. const VENDOR_ID = 'vendor_id';
    6. const NAME = 'name';
    7. /**
    8. * @return int
    9. */
    10. public function getId();
    11. /**
    12. * @param $id
    13. * @return int
    14. */
    15. public function setId($id);
    16. /**
    17. * @return string
    18. */
    19. public function getName();
    20. /**
    21. * @param $name
    22. * @return string
    23. */
    24. public function setName($name);
    25. }

    {module}/Api/Data 新建对象SearchResultInterface,继承Magento\Framework\Api\SearchResultsInterface

    <?php
    
    
    namespace Training5\VendorRepository\Api\Data;
    
    use Magento\Framework\Api\SearchResultsInterface;
    
    
    interface VendorSearchResultInterface extends SearchResultsInterface
    {
        /**
         * @return \Training5\VendorRepository\Api\Data\VendorInterface[]
         */
        public function getItems();
    
        /**
         * @param \Training5\VendorRepository\Api\Data\VendorInterface[] $items
         * @return void
         */
        public function setItems(array $items);
    }
    

    {module}/Api 下新建RepositoryInterface
    定义需要的方法,要写注释
    /*
    @param int $id
    @return \Training5\VendorRepository\Api\Data\VendorInterface
    /

    <?php
    
    
    namespace Training5\VendorRepository\Api;
    
    
    use Magento\Framework\Api\SearchCriteriaInterface;
    use Training5\VendorRepository\Api\Data\VendorSearchResultInterface;
    
    /**
     * @api
     */
    interface VendorRepositoryInterface
    {
    
    
        /**
         * @param int $id
         * @return \Training5\VendorRepository\Api\Data\VendorInterface
         */
        public function load($id);
    
        /**
         * @param \Training5\VendorRepository\Api\Data\VendorInterface $vendor
         * @return \Training5\VendorRepository\Api\Data\VendorInterface
         */
        public function save(\Training5\VendorRepository\Api\Data\VendorInterface $vendor);
    
    
        /**
         * @param SearchCriteriaInterface $searchCriteria
         * @return VendorSearchResultInterface
         */
        public function getList(SearchCriteriaInterface $searchCriteria);
    
        /**
         * @param $id
         * @return array
         */
        public function getAssociatedProducts($id);
    }
    

    在{module}/Model下新建对象实体类,实现Api/Data下的对象接口,继承Magento\Framework\Model\AbstractModel或Magento\Framework\Model\AbstractExtensibleModel;

    <?php
    
    
    namespace Training5\VendorRepository\Model;
    
    
    use Training4\Vendor\Model\TrainingVendor;
    use Training5\VendorRepository\Api\Data\VendorInterface;
    
    class Vendor extends TrainingVendor implements VendorInterface
    {
    
    
        public function getId()
        {
            return parent::getData(self::VENDOR_ID);
        }
    
        public function setId($id)
        {
            return $this->setData(self::VENDOR_ID, $id);
        }
    
        public function getName()
        {
            return parent::getData(self::NAME);
        }
    
        public function setName($name)
        {
            return $this->setData(self::NAME, $name);
        }
    }
    
    <?php
    
    
    namespace Training4\Vendor\Model;
    
    
    use Magento\Framework\Model\AbstractModel;
    
    class TrainingVendor extends AbstractModel
    {
        protected $_idFieldName = 'vendor_id';
    
        protected function _construct()
        {
            $this->_init('Training4\Vendor\Model\ResourceModel\TrainingVendor');
        }
    }
    

    {module}/Model下新建对象RepositoryInterface的实现类

    <?php
    
    
    namespace Training5\VendorRepository\Model;
    
    
    use Training5\VendorRepository\Api\Data;
    use Magento\Framework\Api\SearchCriteria\CollectionProcessorInterface;
    class VendorRepository implements \Training5\VendorRepository\Api\VendorRepositoryInterface
    {
        private $vendorResource;
    
        private $vnedorFactory;
    
        private $collectionProcessor;
    
        private $vendorCollectionFactory;
    
        private $vendorSearchResultInterfaceFactory;
    
        public function __construct
        (
            \Training5\VendorRepository\Model\ResourceModel\Vendor $vendorResource,
            \Training5\VendorRepository\Model\VendorFactory $vendorFactory,
            CollectionProcessorInterface $collectionProcessor,
            \Training5\VendorRepository\Model\ResourceModel\Vendor\CollectionFactory $collectionFactory,
            \Training5\VendorRepository\Api\Data\VendorSearchResultInterfaceFactory $vendorSearchResultInterfaceFactory
        )
        {
            $this->vnedorFactory=$vendorFactory;
            $this->vendorResource = $vendorResource;
            $this->collectionProcessor=$collectionProcessor;
            $this->vendorCollectionFactory=$collectionFactory;
            $this->vendorSearchResultInterfaceFactory=$vendorSearchResultInterfaceFactory;
        }
    
        /**
         * @inheritDoc
         */
        public function load($id)
        {
            $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
            $vendor = $objectManager->get('\Training5\VendorRepository\Model\Vendor');
            $this->vendorResource->load($vendor, $id);
            return $vendor;
        }
    
        /**
         * @inheritDoc
         */
        public function save(Data\VendorInterface $vendor)
        {
            $this->vendorResource->save($vendor);
            return $vendor;
        }
    
        /**
         * @inheritDoc
         */
        public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria)
        {
            $collection = $this->vendorCollectionFactory->create();
            $this->collectionProcessor->process($searchCriteria, $collection);
            $searchResults = $this->vendorSearchResultInterfaceFactory->create();
    
            $searchResults->setSearchCriteria($searchCriteria);
            $searchResults->setItems($collection->getItems());
    
            echo "</br>";
            echo $collection->getSelect()->__toString();
            echo "</br>";
    
            return $searchResults;
        }
    
        /**
         * @inheritDoc
         */
        public function getAssociatedProducts($id)
        {
            $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
            $vendor = $objectManager->get('\Training5\VendorRepository\Model\ResourceModel\Vendor');
            $connection = $vendor->getConnection();
            $select = $connection->select()->from(
                ['vendor' => 'training_vendor'],
                ['v2p.entity_id', 'v2p.vendor_id']
            )->join(['v2p' => 'training4_vendor2product'], 'v2p.vendor_id=vendor.vendor_id')
                ->where('vendor.vendor_id=?', $id);
            echo '<br>';
            echo $select->__toString();
            echo '</br>';
            $data = $connection->fetchAll($select);
    
            return $data;
    
        }
    }
    

    {Module}/Model下新建对象SearchResult实现对象SearchResultInterface接口,继承Magento\Framework\Api\SearchResults;

    <?php
    
    
    namespace Training5\VendorRepository\Model;
    
    use Magento\Framework\Api\SearchResults;
    use Training5\VendorRepository\Api\Data\VendorSearchResultInterface;
    
    class VendorSearchResult extends SearchResults implements VendorSearchResultInterface
    {
    
    }
    

    {module}/Model/ResourceModel下新建
    Model的ResourceModel,继承Magento\Framework\Model\ResourceModel\Db\AbstractDb;
    实现构造方法
    $this->_init(‘training_vendor’, ‘vendor_id’);//分别是表名和主键

    <?php
    
    
    namespace Training5\VendorRepository\Model\ResourceModel;
    
    
    use Training4\Vendor\Model\ResourceModel\TrainingVendor;
    
    class Vendor extends TrainingVendor
    {
    
    }
    
    <?php
    
    
    namespace Training4\Vendor\Model\ResourceModel;
    
    
    use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
    
    class TrainingVendor extends AbstractDb
    {
    
        protected function _construct()
        {
            $this->_init('training_vendor', 'vendor_id');
        }
    }
    

    {Module}/Model/ResourceModel/对象/Collection

    <?php
    
    
    namespace Training5\VendorRepository\Model\ResourceModel\Vendor;
    
    
    use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
    use Training5\VendorRepository\Model\ResourceModel\Vendor;
    
    class Collection extends AbstractCollection
    {
        protected function _construct()
        {
            $this->_init(\Training5\VendorRepository\Model\Vendor::class,
                Vendor::class);
        }
    }
    

    指定Model和ResourceModel

    {module}下etc下新建di.xml
    声明接口与映射

    <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
      <preference for="Training5\VendorRepository\Api\Data\VendorInterface" type="Training5\VendorRepository\Model\Vendor" />
      <preference for="Training5\VendorRepository\Api\VendorRepositoryInterface" type="Training5\VendorRepository\Model\VendorRepository" />
      <preference for="Training5\VendorRepository\Api\Data\VendorSearchResultInterface" type="\Training5\VendorRepository\Model\VendorSearchResult" />
    </config>
    

    额外内容
    将Repository构建为restApi
    etc下新建webapi.xml

    <?xml version="1.0"?>
    <routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
      <route url="/V1/TrainingApi/getVendor" method="GET">
        <service class="Training5\VendorRepository\Api\VendorRepositoryInterface" method="load"/>
        <resources>
          <resource ref="anonymous"/>
        </resources>
      </route>
    
      <route url="/V1/TrainingApi/save" method="POST">
        <service class="Training5\VendorRepository\Api\VendorRepositoryInterface" method="save"/>
        <resources>
          <resource ref="anonymous"/>
        </resources>
      </route>
    </routes>
    

    执行php bin/magento setup:upgrade安装模块

    执行php bin/magento setup:di:compile
    简写php bin/magento s:d:c